文章目录

  • 一、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;
}

内存对齐的相关问题_#pragma


内存对齐的相关问题_内存对齐_02


内存对齐需要一次访存,没对齐可能需要多次,使用内存对齐可以提高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;
}