添加静态constexpr成员是否会更改结构/类的内存映射
Does adding a static constexpr member change the memory mapping of a struct/class?
注意:这个问题出现在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]
- 静态数据成员不是类的子对象的一部分。如果静态数据成员被声明为thread_local,则每个线程有一个成员的副本。如果静态数据成员没有声明为thread_local,那么该类的所有对象都共享该数据成员的一个副本
强调矿。
它是否为constexpr并不重要;它是静态,因此不是实例组合的一部分。
Dummy
和Dummy2
与布局兼容(静态成员无关紧要(,请参见class.mem/23。
然而,该标准并没有定义布局兼容类型的确切属性(它只定义了两种类型何时兼容,但没有说明任何后果(。其意图必须是它们在内存中具有相同的布局,因此可以假设sizeof(Dummy)
等于sizeof(Dummy2)
。
语言定义对对象布局施加了一些约束,但在这些约束范围内,编译器有很大的余地。添加静态成员时,语言定义不要求更改布局,也不禁止更改布局。改变布局没有明显的原因,但也没有绝对的答案。它可能不会改变,但如果它真的很重要,试试看。
相关文章:
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- C++匿名结构作为std::映射值
- 添加静态constexpr成员是否会更改结构/类的内存映射
- C++:映射结构中的结构指针
- 无法添加多个键以映射将结构作为键
- 如何在 c++ 中创建结构向量的映射
- c++ 嵌套结构映射找不到成员
- 带有结构映射的 C++ 向量?
- Unity C#和C 结构映射
- 使用 std::vector 将C++结构映射到 C#
- C++stl::使用结构映射find
- 如何在C++中把结构映射到字符正确的方法
- 更好的数据结构映射函数与多个参数(键)
- 将PolarSSL x509_cert结构映射到pkcs# 11 X.509对象
- 为什么我的JNA结构映射产生奇怪的字段值
- 在函数中填充结构映射的最好方法是什么?
- 如何解决声明结构映射时的编译错误
- 数据结构-C++映射:需要智能算法
- 使用字符串键初始化结构映射