0

在 C++11 中,我们现在有了alignas关键字,它可以用来定义一个新类型,它只是一个现有类型,但具有更严格的对齐方式,例如通过 typedef:

typedef char Maximally_Aligned_Char alignas( max_align_t );

有没有办法以编程方式,给定 atypename 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 警告“忽略模板参数上的属性”,这听起来不错但很危险。

4

1 回答 1

1

老实说,我不明白你能用你的natural_alignment特质做什么。

如果定义一个对齐为 16 的类型,那么我希望该类型的所有实例的对齐为 16。你不能破坏这个契约。

既然你已经知道了alignof,那你为什么不简单地使用它呢?尽管理论上可以想象使用非 2 次方对齐,但在实践中它会非常脆弱,因此您所要做的就是将std::max(sizeof(T), alignof(T))其作为计算的基础,然后出发。

注意:这可能意味着数据打包得不那么紧密,并且引入了填充,但是你为什么要关心呢?您在用户的限制范围内尽力而为。

于 2013-12-06T18:54:37.403 回答