内存对齐

C/C++的内存对齐

无人久伴 提交于 2019-11-26 22:13:45
1、内存对齐之pragma pack语法 语法:#pragma pack( [show] | [push | pop] [, identifier], n ) 作用:指定结构,联合和类的包对齐方式(pack alignment),可以通知给编译器传递预编译指令而改变对指定数据的对齐方法 举个例子如下: 2、基本数据类型所占用内存大小 3、 静态变量static 静态变量 的存放位置与结构体实例的存储地址无关,是 单独存放在静态数据区的,因此用siezof计算其大小时没有将静态成员所占的空间计算进来。 4、 类 空类是会占用内存空间的,而且大小是1,原因是C++要求每个实例在内存中都有独一无二的地址。 (一)类内部的成员变量: 普通的变量要占用内存,但是要注意对齐原则(这点和struct类型很相似)。 static修饰的静态变量不占用内容,原因是编译器将其放在全局变量区。 (二)类内部的成员函数: 普通函数不占用内存。 虚函数要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。所以一个类的虚函数所占用的地址是不变的,和虚函数的个数是没有关系的 5、子类 子类所占内存大小是父类+自身成员变量的值。特别注意的是,子类与父类共享同一个虚函数指针,因此当子类新声明一个虚函数时,不必再保存虚函数表指针入口。 来源: https://www.cnblogs.com/mazhimazhi/p

hotspot的内存对齐

只愿长相守 提交于 2019-11-26 15:52:35
上界对齐 #define ALIGN(x,a) (((x)+(a)-1)&~(a-1)) 就是以a为上界对齐的意思。举个例子4k页面边界的例子,即a=4096:如果x = 3888;那么以上界对齐,执行结果就是4096。如果x = 4096;结果是4096.如果x = 4222; 则结果为8192. 下界对齐 #define ALIGN(x,a) ((x)&~(a-1)) 就是以a为下界界对齐的意思。若x = 3888; 结果为0.如果x = 4096;结果是4096.如果x = 4222; 则结果为4096.你可以把这两种方式理解为“上进”和“丢弃”。 在hotspot中的/vm/utilities/globalDefinitions.cpp文件中 提供的详细算法如下: #define align_size_up_(size, alignment) (((size) + ((alignment) - 1)) & ~((alignment) - 1)) 以alignment为上界进行对齐。   参考文章: https://www.cnblogs.com/Estrong/articles/2857685.html 来源: https://www.cnblogs.com/mazhimazhi/p/11325028.html

C语言

旧街凉风 提交于 2019-11-26 02:31:56
一、编译链接过程 编译 预处理 删除注释,宏替换,头文件展开,条件编译 编译 词法分析,语法分析,语义分析,符号汇总(生成汇编代码) 汇编 将形成的汇编代码转为二进制代码,形成对应的符号表 链接 合并段表以及符号表的重定位 二、指针和数组 数组和指针的区别和联系 联系 表达式中的数组名就是指针 C语言中把数组下标作为指针的偏移量 ==作为函数参数的数组名等同于指针== 区别 数组名在传参时会退化为指针,指针不会(所以一定不要在函数内部对传参后的数组名进行sizeof大小) 内存中数组是一块连续开辟的空间,指针只占一个指针类型的大小空间(32位为4字节,64位为8字节) 数组可以通过下标直接进行访问,指针需要进行计算间接访问 数组名具有常属性,不能进行++,--操作;指针可以 数组指针和指针数组区别 以 int (*p)[n] 为例,从右往左理解,() 高优先级,先定义一个指针,然后看[],说明这是一个指向数组的指针,最后 int 型。 数组指针(int (*p)[n]) 代表一个指向有n个int类型的数组的指针,也叫行指针 指针数组(int *p[n]) 代表一个有n个int* 指针的数组 区别:数组指针由于是一个指针,所以内存中只消耗一个指针大小的空间;指针数组是一个数组,消耗n个对应类型指针大小的空间。 需要注意的点 sizeof字符串指针大小为对应平台下指针大小