关于GCC中__alignof__的最早支持版本及结构体对齐可移植方案的技术问询
关于GCC alignof 支持版本与替代方案的解答
先直接给你核心结论:GCC的__alignof__扩展早在2.95版本就已经支持,远早于你提到的v3.6,所以你的目标平台完全可以放心使用它。
关于__alignof__的性质
你问到它是宏还是函数?都不是——它是GCC提供的一元运算符,作用和C++11标准的alignof完全一致:用来获取某个类型或对象的内存对齐要求。用法也和标准alignof一致,比如:
// 获取int类型的对齐要求 int int_align = __alignof__(int); // 获取某个结构体实例的对齐要求 MyStruct s; int struct_align = __alignof__(s);
替代方案(针对极端老旧版本)
如果万一遇到比2.95还老的GCC版本(虽然你的场景里不太可能),可以用一种不依赖编译器扩展的通用方法,利用结构体成员的偏移量计算对齐:
#include <cstddef> // 或C语言的<stddef.h> template <typename T> struct AlignHelper { char dummy; T value; }; // 定义宏来获取对齐值 #define ALIGNOF(T) offsetof(AlignHelper<T>, value)
这个方法的原理是:结构体中第二个成员的偏移量,等于第一个成员的大小(1字节)加上为了满足对齐要求而填充的字节数,最终结果就是类型T的对齐要求。它完全兼容C++98及更早标准,所有编译器都支持。
命名变更与版本兼容
GCC从未对__alignof__做过命名变更。C++11标准引入的alignof运算符,其实就是借鉴了GCC的__alignof__实现。如果你需要同时兼容新旧版本的GCC,可以用宏做一层封装:
#if __cplusplus >= 201103L || (defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 7) // GCC 4.7及以后完全支持C++11的alignof #define MY_ALIGNOF alignof #else // 旧版本GCC使用__alignof__ #define MY_ALIGNOF __alignof__ #endif
这样在支持C++11的环境中会自动使用标准语法,旧环境则回退到GCC扩展。
内容的提问来源于stack exchange,提问作者Swift - Friday Pie
相关产品推荐
相关产品推荐

