c++ - "natural_alignment_of"类型特征?

标签 c++ c++11 memory-alignment alignas

在 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/

相关文章:

c++ - Qt:一旦显示,如何将光标焦点转移到“查找”对话框/工具中的字段?

c++ - 如何处理为相同输入数据类型返回不同数据类型的 api?

c++ - 在同一项目的 C 函数中调用 C++ 类方法

c++ - 我在下面关于 C++ 标准中的 §9.3.1/3 的观察是否正确?

C++线程开销

c++ - 更改派生类型的对齐方式

c - 读取为未缓存的直接 I/O 打开的文件的最后一个 block 不会产生 EOF,正常行为?

c++ - Octave 和痛饮。 mkoctfile 提示 : unrecognized argument

c++ - 为什么 std::vector 使用 move 构造函数,尽管声明为 noexcept(false)

struct - Fortran - 可分配派生类型的可分配数组