添加静态constexpr成员是否会更改结构/类的内存映射?

时间:2018-10-26 23:19:41

标签: c++ c++11

注意:这个问题出现在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

3 个答案:

答案 0 :(得分:2)

根据语言标准

9.4.2静态数据成员[class.static.data]

  1. 静态数据成员不属于类的子对象。如果将静态数据成员声明为thread_- local,则每个线程有一个成员副本。如果未将静态数据成员声明为thread_local,则该类的所有对象共享该数据成员的一个副本。

强调我。

是否为constexpr无关紧要;它是 static ,因此不属于实例组成部分。

答案 1 :(得分:1)

DummyDummy2布局兼容的(静态成员无关紧要),请参见class.mem/23

但是,该标准并未定义 layout-compatible 类型具有的确切属性(它仅定义了两种类型的 layout-compatible 类型,但未说明关于后果的任何事情)。目的是确保它们在内存中具有相同的布局,因此您可以假定sizeof(Dummy)等于sizeof(Dummy2)

答案 2 :(得分:0)

语言定义对对象布局施加了一些限制,但是在这些限制内,编译器还有很多余地。添加静态成员时,语言定义不需要更改布局,也不会禁止更改。没有明显的理由来更改布局,但是没有绝对的答案。它可能不会改变,但是如果真的很重要,请尝试看看。