C++ 如果我获取静态变量的地址,是否保证它是有序的?

C++ 如果我获取静态变量的地址,是否保证它是有序的?,c++,variables,static,alignment,size,C++,Variables,Static,Alignment,Size,我想知道,如果我接受一个完全静态的类的地址,我能保证它的成员按正确的顺序排列吗?我猜这也适用于在全局范围内定义的一组变量 struct Buffer1 { static float val1; static float val2; }; void readBuffer(void* buffer){ /*Do something*/} int main() { // Sending the buffer readBuffer(&Buffer1);

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

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

我知道在这种情况下,实例化类要好得多,但我对这两个问题很好奇。谢谢。

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


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

只需将这些变量放入一个结构中,也会碰到结构填充问题。你不能做
structbuffer1{float val1,val2;};静态缓冲区1缓冲区1sizeof
的问题。@Ken Y-N是的,肯定是这样,这就是我目前的问题所在。我只是想知道,我正在学习该语言的来龙去脉,并试图了解如何使用静态结构。C++11确实保证同一访问控制中的非静态类数据成员在内存中按顺序排列。@doug有趣。对不起,我不熟悉“相同的访问控制”。这是否意味着在同一地区?是在一个类中连续列出,还是在全局空间中连续列出?@TitoneMaurice:声明的变量由private、public和protected分隔,标准不要求它们是连续的。变量在这些访问说明符之间连续排序,尽管可能带有填充。