编译器对内存填充长度之误解

http://blog.csdn.net/yysdsyl/article/details/1885795

看了《C++ 对像模型》的人,往往会误以为编译器填充是按照计算机字长填充的,如下:

class A
{
   double a;
   char b;
};

sizeof(A) == ?

不了解填充的人会以为是9,看了c++对象模型的(像我)往往会以为是12,昨晚看《程序员面试宝典》一道类似题,开始以为答案给错了。。今天一试才知道,原来我错了。。上题答案(在编译器默认情况下)是 16,VC6.0、MinGW、VS.net均如此。。

《程序员面试宝典》上如是说:CPU的优化原则大致是这样的:对于n字节的元素(n=2、4、8……)它的首地址能被n整除,才能获得最好的性能。设计编译器的时候可以遵循这个原则。也就是说,默认情况下,编译器往往以最大的变量的长度为填充长度,而不是按字节长度。当然也可以通过 #pragma pack(n) 指定编译器的填充长度。这时候应该不是cpu的效率最高的情况了。

另外有个网友讨论说道如果一个类中含有另一个类对象,是否按照包含类的长度填充呢?试验了一下,不是这样,而是按照语言中的基本类型的最大长度填充

时间: 2024-12-28 17:53:46

编译器对内存填充长度之误解的相关文章

编译器对内存的分配

在正式开始今天的博文之前,先看一段代码,思考这段代码有可能出现的情况: int main() { int j, b[10]; for(j = 1; j <= 10; ++j){ b[j] = 0; } } 看完这段代码后,如果觉得这段代码没有什么坑,那不妨注意一下j的范围是从1-10,而b[10]会导致b数组越界哦.思考到结果了吗?先来看看一些内存知识吧. 我们在C/C++中学的变量分三种:局部变量.全局变量(静态变量和全局变量).堆变量 局部变量  由程序员定义普通变量时编译器在内存中的栈空间

winform中的 datagriview 字段自动填充长度

在winfrom 的 datagridview 中 绑定字段 经常回在最后面空出一部分来,显得不美观, 现在教大家如何让它自适应宽度 public static void Autogrid(DataGridView dt) { int width = 0; for (int i = 0; i <dt.Columns.Count; i++) { //将每一列都调整为自动适应模式 dt.AutoResizeColumn(i, DataGridViewAutoSizeColumnMode.AllCel

内存补齐序列一:关于内存对齐和填充

这个问题困扰许久,查了许多资料,网上众说纷纭,整理如下: 对于内存补齐的详细情况,请关注下一篇:C/C++ 内存补齐机制 一.内存对齐的初步讲解 内存对齐可以用一句话来概括: "数据项只能存储在地址是数据项大小的整数倍的内存位置上(分别为偶地址.被4整除的地址.被8整除的地址 )" 例如int类型占用4个字节,地址只能在0,4,8等位置上. 例1: #include <stdio.h> struct xx{ char b; int a; int c; char d; };

C++对象模型与内存位对齐的简单分析(GNU GCC&amp;VS2015编译器)

以Fruit和Apple为例进行分析: Fruit和Apple的定义如下: 通过在两种编译环境下的测试(GNU GCC & VS2015),可以发现这两种编译器的对象模型是一样的,如下图所示: Apple是Fruit的子类,此为两级的单链继承结构.在Apple和Fruit对象内部,均遵循以下原则: 对象中的第一个成员是指向虚表的虚指针: 对象是按照声明中的顺序被保存的: 然而,两种编译器的内存的位对齐方式略有不同. 对于GNU GCC编译器而言,其遵循以下的原则: 按声明中出现的顺序进行内存分配

(转)内存对齐问题

结构体的内存布局依赖于CPU.操作系统.编译器及编译时的对齐选项.结构体内部成员的对齐要求,结构体本身的对齐要求.最重要的有三点 (一)成员对齐.对于结构体内部成员,通常会有这样的规定:各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数.但是也可以看到,有时候某些字段如果严格按照大小紧密排列,根本无法达到这样的目的,因此有时候必须进行padding.各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节编译器会

程序设计基石与实践系列之类型提升、内存分配,数组转指针、打桩和矢量变换

英文出处:Peter Fa?ka: Guide to Advanced Programming in C C语言可用于系统编程.嵌入式系统中,同时也是其他应用程序可能的实现工具之一. 当你对计算机编程怀有强烈兴趣的时候,却对C语言不感冒,这种可能性不大.想全方位地理解C语言是一件极具挑战性的事. Peter Fa?ka 在2014年1月份写下了这篇长文,内容包括:类型提升.内存分配,数组转指针.显式内联.打桩(interpositioning)和矢量变换. 整型溢出和类型提升 多数C程序员以为,

Python笔记_第一篇_童子功_0.内存详解(含位运算)

Python的很多教材中并没有讲内存方面的知识,但是内存的知识非常重要,对于计算机工作原理和方便理解编程语言是非常重要的,尤其是小白,因此需要把这一方面加上,能够更加深入的理解编程语言.这里引用了C语言关于内容的详细讲解,其实很多知识都是相同的. 第一部分:程序(计算机运行)为什么需要内存? 对于内存的理解是对编程语言直接相关的,如果没有对内存有很深的认识的话,对于编程语言也就是没有根本的认识,编程语言跟内存有千丝万缕的联系. 1.1 计算机程序运行的目的 计算机为什么需要编程?编程已经编了那么

1、C_内存

程序为什么需要内存 程序运行的目的: 程序运行是为了得到一定的结果,程序运行其实是在做一系列的数据计算,所以:程序=代码+数据: 程序运行的目的不外乎2个:过程.结果:    用函数来类比:函数的形参就相当于代加工的数据,函数的本体是代码,函数的返回值就是结果,函数体的执行过程就是过程.如下列函数: int add(int a, int b) { return a + b; } // 这个函数的执行就是为了得到结果 void add(int a, int b) { int c; c = a +

【转】深入理解JVM—JVM内存模型

http://www.cnblogs.com/dingyingsi/p/3760447.html#3497199 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因此,现在CPU同内存交互就变