在C++11中,我们现在有了alignas关键字,它可以用来定义一个新类型,它只是一个现有的类型,但是使用更严格的对齐方式,例如typedef:
typedef char Maximally_Aligned_Char alignas( max_align_t );在给定一个typename T的情况下,是否有一种以编程方式确定该类型的原始“自然”对齐方式?类似于以下将编译的概念性natural_alignment_of type_trait:
size_t natural_char_alignment = natural_alignment_of< Maximally_Aligned_Char >::value;
static_assert( natural_char_alignment == alignof( char ) );背景
我正在编写模板代码来处理所有标量类型。一般来说,对于整数,( sizeof( T ) == alignof( T ) )是真的,但是有了官方的alignas支持,我想我不能再做这个假设了。
炒作
也许像std::decay这样的东西会起作用?测试代码时,我看到G++4.8警告“忽略模板参数上的属性”,这听起来很好,也很危险。
发布于 2013-12-06 18:54:37
我真的不明白你能用你的natural_alignment特性做些什么。
如果I定义了一个对齐率为16的类型,那么我希望该类型的所有实例都有16对齐。
既然您已经了解alignof,那么为什么不直接使用它呢?即使在理论上可以想象使用非幂的2对齐,但在实践中它将是极其脆弱的,所以你所要做的就是把std::max(sizeof(T), alignof(T))作为计算的基础,然后你就可以离开了。
注意:这可能意味着数据被压缩得不那么紧,填充也会被引入,但是你为什么要关心呢?您在用户的约束范围内尽了最大努力。
https://stackoverflow.com/questions/20431108
复制相似问题