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

Does adding a static constexpr member change the memory mapping of a struct/class?

本文关键字:结构 映射 内存 constexpr 静态 成员 是否 添加      更新时间:2023-10-16

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

在这次测试中,这个理论并没有被推翻,但我还远远不能说这是有保证的。

int main() {
std::cout << sizeof(Dummy) << " " << sizeof(Dummy2) << std::endl;
}

512 512

根据语言标准,

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

  1. 静态数据成员不是类的子对象的一部分。如果静态数据成员被声明为thread_local,则每个线程有一个成员的副本。如果静态数据成员没有声明为thread_local,那么该类的所有对象都共享该数据成员的一个副本

强调矿。

它是否为constexpr并不重要;它是静态,因此不是实例组合的一部分。

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

然而,该标准并没有定义布局兼容类型的确切属性(它只定义了两种类型何时兼容,但没有说明任何后果(。其意图必须是它们在内存中具有相同的布局,因此可以假设sizeof(Dummy)等于sizeof(Dummy2)

语言定义对对象布局施加了一些约束,但在这些约束范围内,编译器有很大的余地。添加静态成员时,语言定义不要求更改布局,也不禁止更改布局。改变布局没有明显的原因,但也没有绝对的答案。它可能不会改变,但如果它真的很重要,试试看。