编译器是否优化大小为0的结构
Does the compiler optimise structs of size 0?
如果我定义了如下结构:
struct blank {
int : 0;
};
编译器会在运行时对此进行优化吗?
我问这个问题是因为这个很受欢迎的SO问题。我想在我自己的C/C++代码中使用类似的编译时检查。我正在努力使程序尽可能优化,所以如果我只打算将这些空结构用于编译时检查,我不希望它们在运行时一直存在。
附带说明一下,是否有一种C++惯用方法可以实现与链接中相同的结果?
C++只允许在对象实现基类时进行优化。(因此,它被称为空基优化或EBO。)对于一个单独存在的对象,或者作为另一个struct
的成员,它必须至少有一个字节大,即使该字节只是填充。
至于像链接问题中的结构,不要担心。那里没有对象,只有一个类型。即使有一个对象,它也会被链接器剥离。除非您特别要求导出所有内容,否则未引用的函数和全局对象不会进入可执行文件。即使在这种情况下,它可能仍然需要有一个名字才能保留。
正如其他人所提到的,C++11实现这一点的方法是static_assert
。它需要一条错误消息:
static_assert( condition, "Error: condition was false." );
空结构保证有自己的地址,但仅此而已:您不会花时间构建它(毕竟,它是空的;没有什么可构建的)。
做同样事情的C++惯用方法是使用static_assert
(在符合C++11标准的编译器中可用)。
取决于。如果按照假设规则,可以完全消除该结构的所有实例,则编译器可以执行该优化。编译器是否这样做取决于它是哪个编译器,也可能取决于优化器设置。
在实践中,跨越模块边界传递struct
实例的地址是在RAM中以至少一个字节的大小实现实例的一种非常可靠的方式(除非整个程序优化器捕捉到它)。使用该struct
作为另一个struct
或class
中的成员的类型也是如此。
相关文章:
- 无法将结构注册为增强几何体3D点
- 将前向声明的结构替换为最近定义的结构
- 如何大致将 cpp 代码结构转换为 python
- 如何将可变大小的结构转换为字符数组
- 尝试传递结构数组,但出现"无法将'结构'转换为'结构*'错误
- 我可以安全地将浮点数的结构转换为浮点数组吗C++?
- 如何将结构转换为字符串?
- 将结构别名为其第一个成员是否严格违反别名
- gcc 显示结构属性为 0,但 clang 显示不同的值
- 如何将C++结构转换为 C# 等效结构?
- 将结构转换为布尔值
- 将具有不同字段的结构转换为 uint8 的数组
- 使用Python将C 结构更改为JSON字符串
- 将结构编写为二进制,其中一个成员是字符串
- 在C++中将数据结构表示为字符串的首选方法是什么?
- 将 constexpr 结构转换为运行时结构
- 将结构转换为类
- 我必须将记录结构转换为一类,并且不断遇到多个错误
- 如何将 ANSI C 结构转换为 C++ 类,但保持其 ANSI C 友好
- 从较大的数据类型(结构)转换为较小的数据类型