编译器是否优化大小为0的结构

Does the compiler optimise structs of size 0?

本文关键字:结构 小为 是否 优化 编译器      更新时间:2023-10-16

如果我定义了如下结构:

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作为另一个structclass中的成员的类型也是如此。