You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:27:14