【发布时间】:2020-03-25 07:21:09
【问题描述】:
我在c++20 中玩[[no_unique_address]]。
在cppreference 的示例中,我们有一个空类型Empty 和类型Z
struct Empty {}; // empty class
struct Z {
char c;
[[no_unique_address]] Empty e1, e2;
};
显然,Z 的大小必须至少为2,因为e1 和e2 的类型相同。
但是,我真的很想拥有大小为1 的Z。这让我开始思考,如何将 Empty 包装在一些带有额外模板参数的包装类中,该模板参数强制执行不同类型的 e1 和 e2。
template <typename T, int i>
struct Wrapper : public T{};
struct Z1 {
char c;
[[no_unique_address]] Wrapper<Empty,1> e1;
[[no_unique_address]] Wrapper<Empty,2> e2;
};
很遗憾,sizeof(Z1)==2。有没有一个技巧可以让Z1 的大小变成一个?
我正在使用 gcc version 9.2.1 和 clang version 9.0.0 对此进行测试
在我的应用程序中,我有很多空类型的表单
template <typename T, typename S>
struct Empty{
[[no_unique_address]] T t;
[[no_unique_address]] S s;
};
如果T 和S 也是空类型并且是不同的,那么哪个是空类型!即使T 和S 是相同类型,我也希望此类型为空。
【问题讨论】:
-
向
T本身添加模板参数怎么样?这将产生不同的类型。现在,Wrappers 都继承自T的事实阻碍了你...... -
@MaxLanghof 向
T添加模板参数是什么意思?现在,T是一个模板参数。 -
不要从
T继承。 -
@Evg 在这里没有区别。
-
仅仅因为它大于 1 并不能使它非空:coliru.stacked-crooked.com/a/51aa2be4aff4842e
标签: c++ struct c++20 memory-layout object-identity