As mentioned
,我们可以使用
[[no_unique_address]]
以避免为空类分配内存。它受到了除MSVC之外的所有主要编译器的尊敬。MSVC有自己的扩展
[[msvc::no_unique_address]]
。我们将一个宏包裹在这个周围,它运行良好:
#include <stdio.h>
#ifdef _MSC_VER
#define NO_UNIQUE_ADDRESS [[msvc::no_unique_address]]
#else
#define NO_UNIQUE_ADDRESS [[no_unique_address]]
#endif
template <class Base>
struct Wrapper : public Base {
private:
NO_UNIQUE_ADDRESS struct Init {} _ = [] {
puts("Wrapper init");
return Init{};
}();
public:
using Base::Base;
};
struct Foo {
int i;
Foo(int i) : i(i) {
printf("Foo(%d)\n", i);
}
};
int main() {
Wrapper<Foo> wfoo(42);
Foo foo(43);
static_assert(sizeof(wfoo) == sizeof(foo));
}
你仍然需要注意把它放在所有其他成员之后,以确保在我们触摸他们时他们已经初始化,所以这并不理想。
See online