c++ - 是否有不关心结构/类布局的编译指示?如果不是,为什么?

标签 c++ c struct memory-layout

有多种pragma用于控制结构/类布局,例如pragma pack。但据我所知,没有 pragma 表示“我不关心布局。它是内部的,代码不依赖它。重新排序以获得最佳性能/大小。” . AFAIK,这是典型情况,在许多情况下它可以提高性能/大小。此外,即使程序员非常小心地根据性能/大小对其重新排序,不同的目标架构也可能具有不同的最佳布局。

编辑:澄清一下,我说的是成员的顺序。填充已经是可控的。

另外,PVS-Studio 有一个相关的 message .这就是我所说的 - 为什么这不能由带有 pragma 的编译器完成?

最佳答案

该语言特别指出类成员在内存中的排序方式与它们在每个访问级别(如 private)中的排序方式相同。编译指示无法覆盖此行为。

参见 9.2/14:

Nonstatic data members of a (non-union) class with the same access control (Clause 11) are allocated so that later members have higher addresses within a class object. The order of allocation of non-static data members with different access control is unspecified

请记住,重新排序成员会改变子对象构造函数和析构函数的调用顺序,也可能会改变其他事情。即使给编译器一个 pragma 在幕后进行这些类型的更改似乎也非常冒险(如果您有一个成员依赖于另一个成员的初始化怎么办)。

关于c++ - 是否有不关心结构/类布局的编译指示?如果不是,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26408426/

相关文章:

c - 在 C 中对 CSV 文件进行排序

c - a[][] 和 (*a)[] 不等同于函数参数吗?

c++ - C++ 代码中的这个 struct X 有什么问题?

c++ - 将结构传递给 void 函数

c++ 没有将值插入注册表

c++ - 我如何在另一个线程 Qt 中显示 MessageBox

c++ - 如何在 VSCode 上自动创建 C++ 类

c++ - 为什么 pair、make_pair 和 rel_ops 都在同一个包含文件中?

c++ - 在 extern "C"中包装 C++ 对象

c - C高级题: Please explain C construct *({ foo(&bar); &bar; })