alignof(i)与alignof(decltype(i))的区别及行为疑问
关于alignof(i)与alignof(decltype(i))的区别与疑问解答
先看你给出的代码:
#include <iostream> alignas(16) int i; int main() { std::cout << alignof(i) << std::endl; // 输出:16 并伴随警告 std::cout << alignof(decltype(i)) << std::endl; // 输出:4 }
一、两者的区别与作用
1. alignof(i)的特性与作用
- 这是编译器的非标准扩展用法(标准C++规定
alignof的参数必须是类型标识),它直接获取变量i的实际对齐要求——也就是你通过alignas(16)给这个int变量强制指定的16字节对齐,所以输出16。 - 编译器会弹出警告,是因为这种写法不符合C++标准语法,标准只允许
alignof接收类型而非对象。
2. alignof(decltype(i))的特性与作用
decltype(i)的核心作用是推导变量i的原始基础类型,这里i的本质类型就是int,alignas只是给这个变量附加了对齐属性,并没有改变它的类型本身。- 因此
alignof(decltype(i))等价于alignof(int),获取的是int类型的默认对齐要求(通常和int的大小一致,为4字节),所以输出4。
二、你的预期与实际结果不符的原因
为什么
alignof(i)能编译?
主流编译器(如GCC、Clang)都支持alignof(对象)作为扩展语法,虽然不符合标准,但允许编译并返回对象的实际对齐值,同时通过警告提示你这是非标准用法。为什么
alignof(decltype(i))返回4而非16?decltype只会推导变量的基础类型,不会附带变量的对齐、存储类(如static)等额外属性。alignas(16)是作用在变量i本身上的,并没有修改int这个类型的对齐属性,所以decltype(i)还是普通的int,它的默认对齐就是4字节。
内容的提问来源于stack exchange,提问作者JohnFreeman1212
相关产品推荐
相关产品推荐

