注意:这个问题出现在C ++和C#程序之间的共享内存的上下文中。
在C ++ 11中,添加static constexpr
成员是否在内存映射方面有任何改变?
我直觉地说一个static constexpr
成员不占用任何内存,但是我想我忽略了一些非常基本的方面,例如多态性...
那么,在下面的示例中,是否保证Dummy实例和Dummy2实例占用相同的内存量?
struct Dummy {
static constexpr std::size_t kSize = 512;
char data[kSize];
};
static constexpr std::size_t kSize2 = 512;
struct Dummy2 {
char data[kSize2];
};
在this test中,这一理论并没有得到反驳,但是我不能说这是可以保证的。
int main() {
std::cout << sizeof(Dummy) << " " << sizeof(Dummy2) << std::endl;
}
512 512
答案 0 :(得分:2)
根据语言标准
9.4.2静态数据成员[class.static.data]
强调我。
是否为constexpr无关紧要;它是 static ,因此不属于实例组成部分。
答案 1 :(得分:1)
Dummy
和Dummy2
是布局兼容的(静态成员无关紧要),请参见class.mem/23。
但是,该标准并未定义 layout-compatible 类型具有的确切属性(它仅定义了两种类型的 layout-compatible 类型,但未说明关于后果的任何事情)。目的是确保它们在内存中具有相同的布局,因此您可以假定sizeof(Dummy)
等于sizeof(Dummy2)
。
答案 2 :(得分:0)
语言定义对对象布局施加了一些限制,但是在这些限制内,编译器还有很多余地。添加静态成员时,语言定义不需要更改布局,也不会禁止更改。没有明显的理由来更改布局,但是没有绝对的答案。它可能不会改变,但是如果真的很重要,请尝试看看。