站长申论,常用网站建设软件,wordpress命令执行,wordpress is_single() 为空sizeof()运算符用来求对象所占内存空间的大小。
1、常见数据类型所占空间大小 下面是一些常见数据类型所占的空间大小
类型32位操作系统64位操作系统 char 14bool14short22int44long44double88float44*48
2、数组的sizeof#xff08;#xff09; 一般情况下数组所占内存空… sizeof()运算符用来求对象所占内存空间的大小。
1、常见数据类型所占空间大小 下面是一些常见数据类型所占的空间大小
类型32位操作系统64位操作系统 char 14bool14short22int44long44double88float44*48
2、数组的sizeof 一般情况下数组所占内存空间的大小 单个类型所占空间大小 * 数组长度不会因为你数组内是否有东西而影响如下
int a1[5];
int a2[] { 1,2,3,4,5};
cout sizeof(a1) endl;
cout sizeof(a2) endl; 我们知道int数据类型大小为4字节所以上面两个数组的大小就为 4*520字节。 对于字符数组有个特殊的字符‘\0’空字符。有下面几种情况
//大括号字符个数小于字符数组长度其余空元素会自动赋值为空字符
char str1[10] { a, b, c };
cout sizeof(str1) endl; //输出为10//大括号字符个数等于字符数组长度系统不会自动添加\0,
char str2[3] { a, b, c };
cout sizeof(str2) endl; //输出为3//这种以字符串的形式赋值的系统会自动在最后面添加\0
char str3[] hello world!;
cout sizeof(str3) endl; //输出为13最后还有一个我们看不见的\0
cout strlen(str3) endl; //输出为12这个函数返回字符串长度有效长度碰到第一个‘\0’就会停止计算//下面这种情况会报错会提示const char[13] 不能赋值给 const char[12]
//因为字符串最后都会有一个\0,把12改成13编译才能通过
char str[12] hello world!; 3、结构体的sizeof 结构体的大小绝大部分情况下不会直接等于各个成员大小的总和编译器为了优化对结构体成员的访问总会在结构体中插入一些空白字节。
3.1、结构体内存对齐原则
结构体的第一个数据成员存放的地址为结构体变量偏移量为0的地址也就是首地址结构体变量中的每个成员相对于结构体首地址的偏移量都是该成员基本数据类型所占字节的整数倍。如char可以放在任何位置int只可以放在结构体变量偏移量为4的倍数的位置或者结构体的首地址(为第一个数据成员时)的位置上。内部对齐结构体变量的总大小为结构体变量中“最大基本数据类型成员所占字节数”的整数倍。如果结构体只有有int、char、short三种类型其中int所占空间最大为4个字节最后这个结构体所占空间就一定是4的倍数补齐结构体变量的首地址必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍。整体对齐
3.2、案例
struct text1{char a;short b;int c;};
struct text2{char a;int b;short c;};
cout sizeof(text1) endl; //结果为8
cout sizeof(text2) endl; //结果为12 对于text1char a占1个字节存放在偏移量为0的位置short b占2个字节因为要存放在2的整数倍的偏移量的位置只能存放在偏移量为2、3两个字节位置这样偏移量为1的地方就被空出来了int c就可以存放在4、5、6、7最后因为最大的数据类型是int所以这个结构体所占空间就要为4的倍数刚好0-7占了8个字节只不过是空的。
text1结构体占用的内存空间 结构体变量偏移量存放的变量0a1空2b3b4c5c6c7c 同理这里只用了10个字节最后要补齐到12个字节所以最后要再开辟两个字节的空间。
text2结构体占用的内存空间 结构体变量偏移量存放的变量0a1空2空3空4b5b6b7b8 c 9c10空11空 3.3、#pragma pack(N) 指定对齐值 结构体的对齐规则的第二点char可以放在任何位置是因为char的自身对齐值为1可以被其他数整除。int的自身对齐值为4只可以放在被4整除的地方。 我们可以通过宏#pragma pack(N)来指定这个对齐值这个N只能是2的幂次方1、2、4、8......。计算的时候会使用自身对齐值和指定对齐值的最小值来作为最终对齐值。即min{自身对齐值指定对齐值}。这时整体对齐,字节大小是min{所有成员中自身对齐值最大的, 指定对齐值} 的整数倍 下面代码同样的两个结果体text3、text4设置不同的对齐值最后所占内存空间大小也不同。
#pragma pack(1)typedef text3{char a;int b;short c;};#pragma pack(2)typedef text4{char a;int b;short c;};cout sizeof(text3) endl;//结果为7cout sizeof(text4) endl;//结果为8 text3把对齐值设置为了1所以int和short的对齐值都变成了1也都可以放在任何位置也就是所有数据在内存中是连续存储的。最后占的内存就是142 7个字节。7也是1的整数倍满足整体对齐。
text3结构体占用的内存空间 结构体变量偏移量存放的变量0a1b2b3b4b5c6c text4把对齐值设置为了2所以int的对齐值就变成了2short还是2。然后int就要从偏移量2开始。
text4结构体占用的内存空间 结构体变量偏移量存放的变量0a1空2b3b4b5b6c7c
3.4、内存对齐的用处 内存对齐是一种优化技术它对数据在内存中的排列进行调整以提高访问效率和性能。以下是内存对齐的几个用途 提高访问效率内存对齐可以使得结构体成员在内存中按照自然边界对齐减少内存访问的次数和开销。当数据按照对齐要求存储时CPU可以直接读取整个对齐的数据块而不需要多次读取多个不对齐的字节。 避免总线错误某些计算机体系结构要求特定数据类型必须位于特定地址上。如果没有正确对齐可能会产生总线错误导致程序崩溃或产生不可确定的行为。 节省空间内存对齐可能会引入填充字节来满足对齐要求从而增加结构体的实际大小。然而通过对齐对结构体进行布局可以避免由于对齐问题产生的额外空间浪费。 兼容不同体系结构不同的计算机体系结构对内存对齐有不同要求。进行内存对齐可以提高代码的可移植性使得代码在不同的体系结构上能够正确地运行。