typeid(x).name()返回'y'代表什么?C++对齐值类型疑问
关于alignof返回值类型与typeid().name()输出'y'的解析
先看代码运行输出的12 4:
sizeof(Foo)为12:结构体Foo的成员int(4字节)、float(4字节)、char(1字节)原始总大小是9,但结构体需满足对齐规则——对齐到成员中最高的对齐要求(int和float的对齐值都是4字节),因此会在char后补充3个填充字节,最终总大小为12。alignof(Foo)为4:结构体的对齐值等于其成员里对齐要求最高的那个,这里int和float的对齐值都是4,所以结构体的对齐值也为4。
再解释typeid(x).name()输出y的问题:
alignof的返回类型是**std::size_t,但typeid().name()返回的是编译器经过名称混淆(mangling)后的类型缩写,这个结果是实现定义**的,不同编译器、不同架构下的输出都可能不同。- 在GCC/Clang这类编译器中,
y是unsigned long long的混淆名称缩写。通常std::size_t会被定义为与当前架构寻址宽度匹配的无符号整数类型——64位系统上一般是unsigned long long,这就对应了输出的y。
如果想要可读性更强的类型名称,可以使用编译器提供的解混淆工具,比如GCC的__cxa_demangle函数,示例代码如下:
#include <iostream> #include <typeinfo> #include <cxxabi.h> void alignment() { struct Foo { int i; float f; char c; }; std::cout << sizeof(Foo) << '\t' << alignof(Foo) << '\n'; auto x = alignof(Foo); int status; char* demangled = abi::__cxa_demangle(typeid(x).name(), nullptr, nullptr, &status); if (status == 0) { std::cout << demangled << '\n'; free(demangled); } else { std::cout << typeid(x).name() << '\n'; } }
这段代码会输出unsigned long long(64位系统)或对应的实际类型,而非混淆后的缩写。
内容的提问来源于stack exchange,提问作者PiotrBzdrega
相关产品推荐
相关产品推荐

