C++中long double出现三种不同大小值的原因咨询
嘿,这个问题挺有意思的,我来帮你拆解下为啥会出现三种不同的结果:
VSCode IntelliSense显示8字节
IntelliSense的静态分析模型并不总是和你实际使用的编译器完全匹配。你用的是x86_64-w64-mingw32,但IntelliSense可能默认采用了更通用的规则,把long double等同于double(也就是8字节),这是它的分析局限,并不是编译运行后的真实结果。std::numeric_limits的结果对应11-12字节
这里要注意,std::numeric_limits给出的是long double实际存储有效数据的部分。在x86_64架构的mingw编译器中,long double采用的是80位扩展精度浮点数格式:它的有效数字位是64位(对应digits=64),加上指数位等,实际有效数据占用10字节左右。你计算出的11-12字节是对这个有效存储部分的近似,这反映的是类型的精度能力,不是内存中实际占用的总空间。std::cout输出sizeof(long double)为16字节
这是编译器在内存中实际分配的大小。为了提升内存访问效率,x86_64架构下会要求数据对齐到16字节的边界。所以即使80位浮点数只需要10字节的有效空间,编译器会把它填充到16字节,确保内存对齐,这就是sizeof返回的真实内存占用量。
简单来说,这三个数值其实是从不同层面描述long double的特性:IntelliSense的静态分析偏差、类型的真实精度存储需求、内存对齐后的实际占用空间,它们并不矛盾,只是你刚好碰到了三种不同维度的测量方式而已~
内容来源于stack exchange

