2021-10-23 内存对齐

本文介绍了内存对齐在C++中的作用,包括提高读取效率和跨平台移植性,并通过实例展示了64位和32位系统下默认对齐系数。同时,对比了sizeof和strlen两个函数的区别,前者计算变量所占内存大小,后者计算字符串长度。此外,还探讨了字符数组的不同声明方式及其影响。
摘要由CSDN通过智能技术生成

C++自定义结构体和类中的数据都需要内存对齐。内存对齐,就是自定义数据中偏移量不为默认对齐系数的,需要进行字节填充。对于64位操作系统,内存对齐系数默认为8,(8位1字节,64位8字节),对于32位操作系统,内存对齐系数默认为4。
内存对齐的好处有以下:
方便计算机读取数据,提高了读取效率;便于在不同平台中进行移植,因为某些硬件设备不支持非内存对齐的内存读取。

#include<iostream>
using namespace std;
struct A {
	int a; //4
	char b;//8
	string c;//36
	short d[3];//44
};
int main() {
	A a;
	cout << "int a的大小是:" << sizeof(a.a) << endl;
	cout << "char b的大小是:" << sizeof(a.b) << endl;
	cout<< "string的大小是:" << sizeof(a.c) << endl;
	cout << "short d[3]的大小是:" << sizeof(a.d) << endl;
	cout << "struct a的大小是:" << sizeof(a) << endl;
	return 0;//输出依次是:4,1,28,6,44
}

这里使用到了sizeof,某些时候面试会问到sizeof和strlen的区别。

int main() {
	char s[]="jiayou";
	cout << "sizeof(string)=" << sizeof(string) << endl;//输出28
	cout << "sizeof(string)=" << sizeof(s) << endl;//输出7
	cout << "strlen(string)=" << strlen(s) << endl;//输出6
	return 0;
}

sizeof(s)求的是s在内存中的位数,计算到了’\0’,strlen(s)求的是s的字符长度,所以sizeof(s)比strlen(s)多1。
sizeof()本身是关键字,参数可以是类型也可以是变量,计算在编译时进行。
strlen()本身是库函数,参数必须是char *类型的变量。

再引申出声明字符数组的几种方法:

char s[]="jiayou";
const char* s1 = "jiayou";
char s2[7] = "jiayou";//这里定义六个字符必须用>=7的数字在中括号中,而最终的sizeof(s2)结果是声明的字符数组大小,strlen(s2)结果为6
char s3[2] = {'a'};
cout << "s3=" << s3 << endl;//输出a
cout << "*s+1=" << *(s + 1 )<< endl;//输出i

char s3[10]={‘0’},s3=‘0’…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值