【发布时间】:2025-02-23 05:55:02
【问题描述】:
有多种pragmas 用于控制结构/类布局,例如pragma pack。但据我所知,没有pragma 说“我不关心布局。它是内部的,代码不依赖它。重新排序以获得最佳性能/大小。”。 AFAIK,这是典型的案例,它可以在许多情况下提高性能/大小。此外,即使程序员足够小心地根据性能/大小对其进行重新排序,不同的目标架构也可能具有不同的最佳布局。
编辑:澄清一下,我说的是成员的顺序。填充已经是可控的。
另外,PVS-Studio 有一个相关的message。这就是我要说的——为什么这不能由带有pragma 的编译器来完成?
【问题讨论】:
-
您的意思是允许重新排序数据成员吗?
-
这个问题没有明确说明,因为 C 和 C++ 都没有提到
pragma。也许您正在使用的编译器有一些特定于实现的细节,但它们将特定于该编译器。 -
我认为
pragmas 可以违反规范?例如__declspec(novtable),我认为规范不允许。 -
这是存在的,只是它在 C 或 C++ 编译器中不常见。例如,.NET 会这样做,CLR 会优化对象的布局并重新排序成员以获得尽可能小的布局。但它也在运行时强制执行此操作,布局是不可发现的,并且映射到定义的布局需要编组。 C/C++ 的方式是让它成为程序员的工作。
-
一些旧版本(可能是 4.4 或 4.5)的 GCC 有一个优化通道来重新排序
struct-s 的成员,但这并不总是很好,后来被删除了。
标签: c++ c struct memory-layout