在 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 警告“忽略模板参数上的属性”,这听起来不错但很危险。
最佳答案
老实说,我不明白你可以用你的 natural_alignment
特征做什么。
如果我定义了一个对齐为 16 的类型,那么我希望该类型的所有实例都具有 16 的对齐。您不得违反此约定。
既然您已经了解alignof
,那您为什么不简单地使用它呢?尽管理论上可以想象使用 2 的非幂对齐,但在实践中它会非常脆弱,所以你所要做的就是采用 std::max(sizeof(T), alignof(T))
作为您计算的基础,然后您就可以开始了。
注意:这可能意味着数据打包不那么紧密,并且引入了填充,但您为什么要关心呢?您在用户的限制范围内尽力而为。
关于c++ - "natural_alignment_of"类型特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20431108/