文章目录
- 一、sizeof与strlen区别
- 二、内存对齐
- 1、面试题--->什么是内存对齐?
- 2、内存对齐的规则
- 3、面试题--->为什么要使用内存对齐(提高访问内存速度)?
- 4、如何修改内存对齐参数
- 三、判断两个结构体是否相等
一、sizeof与strlen区别
- sizeof 是运算符,结果在编译时计算,不能返回动态分配的内存空间大小;strlen 是库函数,结果在运行时运算。
- sizeof功能是获取对象字节大小;strlen功能是计算字符串的长度,从字符串开头扫描直到遇到第一个’\0’。
- 参数:sizeof 参数可以是任何数据类型(数组、指针、对象…);strlen参数必须使字符型指针(char*)。
二、内存对齐
#include<iostream>
using namespace std;
struct A{
char a;
int b;
short c;
};
struct B{
short c;
char a;
int b;
};
int main(){
cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl;
return 0;
}
sizeof(A) is 12
sizeof(B) is 8
为什么两个一样的结构体,但是sizeof大小却不同?答案就是内存对齐导致结果不同。
1、面试题—>什么是内存对齐?
内存对齐是主要是指数据存储在内存中时,应该放置在地址是数据项大小的整数倍的内存位置上。
2、内存对齐的规则
- 对于结构的各个成员,第一个成员位于偏移为0的位置,以后的每个数据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身长度
)的倍数。 - 在所有的数据成员完成各自对齐之后,结构或联合体本身也要进行对齐,总长度是长度最长的数据成员的倍数。
3、面试题—>为什么要使用内存对齐(提高访问内存速度)?
CPU它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存。假如是4字节存取,对于int,long这种可以,但是存在short char这样的类型。
struct test{
char a;
int b;
char c;
}
内存对齐需要一次访存,没对齐可能需要多次,使用内存对齐可以提高CPU的内存访问速度。
4、如何修改内存对齐参数
在内存对齐中用到的指令为#pragma pack()
,这个指令理默认的参数8。实际上,也可以自行设置这个参数,以控制对齐结果。比如在程序中加入下列语句:
#pragma pack(4)
三、判断两个结构体是否相等
由于存在内存对齐的问题,所以不能直接sizeof比较大小,应该重载操作符"==":
#include<iostream>
using namespace std;
struct s
{
int a;
int b;
bool operator == (const s &rhs);
};
bool s::operator == (const s &rhs)
{
return ((a == rhs.a) && (b == rhs.b));
}
int main()
{
struct s s1, s2;
s1.a = 1;
s1.b = 2;
s2.a = 1;
s2.b = 2;
if (s1 == s2)
cout << "两个结构体相等" << endl;
else
cout << "两个结构体不相等" << endl;
return 0;
}