【问题标题】:Are static variables guaranteed to be in order if I take its address?如果我获取它的地址,是否保证静态变量是有序的?
【发布时间】:2016-11-24 02:22:38
【问题描述】:

我想知道,如果我获取一个完全静态类的地址,我能保证它的成员以正确的顺序排列吗?我想这也适用于在全局范围内定义的一组变量。

struct Buffer1
{
    static float val1;
    static float val2;
};

void readBuffer(void* buffer){ /*Do something*/}

int main()
{
// Sending the buffer
    readBuffer(&Buffer1);               // Type name is not allowed
    readBuffer(&Buffer1::val1);         // Does work, wondering if data will be correct

    return 0;
}

另外,有没有办法获取一组静态或全局变量的大小?喜欢:

// Getting the size of the buffer
    size_t sizeOfBuffer = sizeof(Buffer1);  // Wrong size, doesn't measure static members
    sizeOfBuffer = sizeof(Buffer1::val1) + sizeof(Buffer1::val2);   // Does work but doesn't account for data padding/alignment, and is also tedious to change

我知道在这种情况下使用实例化类会更好,但我对这两个问题很好奇。谢谢。

【问题讨论】:

  • 只需将这些变量放在一个结构中
  • 您还会遇到结构填充问题。你不能改用struct Buffer1 { float val1, val2; }; static Buffer1 buffer1;,这样你至少可以避免sizeof 问题。
  • @Ken Y-N 是的,当然,我目前就是这样。我只是想知道,我正在学习语言的来龙去脉,并试图看看我可以用静态结构做什么。

标签: c++ variables static alignment size


【解决方案1】:

不,C++ 标准没有指定对象在内存中的顺序,在静态范围内。

C++ 标准也不保证类成员的相对顺序。

【讨论】:

  • C++11 确实保证同一访问控制中的非静态类数据成员在内存中按顺序排列。
  • @doug 有趣。抱歉,我不熟悉“相同的访问控制”。这是否意味着在同一地区?那么是在一个类中连续列出,还是在全局空间中连续列出?
  • @TitoneMaurice :由 private、public、protected 分隔的声明变量不需要按照标准是连续的。变量在这些访问说明符之间连续排序,尽管可能带有填充。
猜你喜欢
  • 2014-08-05
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2017-03-29
  • 2011-05-24
  • 2012-03-11
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多