2016-11-24 26 views
1

我想知道,如果我把一个完全静态类的地址,我保证它的成员按照正确的顺序排列?我想这也适用于全球范围内定义的一组变量。如果我使用地址,是否保证静态变量的顺序?

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 

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

+2

只需将这些变量放入结构中 –

+1

您还会遇到结构填充问题。你不能'struct Buffer1 {float val1,val2; };静态缓冲区1缓冲区1;'相反,所以你可以避免至少'sizeof'问题。 –

+0

@Ken Y-N是的,当然,这是我现在的样子。我只是在想,我正在学习语言的来龙去脉,并试图看看我能用静态结构做些什么。 – Zebrafish

回答

2

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

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

+0

C++ 11确保相同访问控制中的非静态类数据成员在内存中按顺序排序。 – doug

+0

@doug有趣。对不起,我不熟悉“相同的访问控制”。这是否意味着在同一地区?所以在课堂上连续列出,还是在全球空间中连续列出? – Zebrafish

+1

@TitoneMaurice:由私有,公共,受保护的声明变量不需要被标准连续。变量在这些访问说明符之间连续排列,尽管可能使用填充。 – doug