首页 > 系统相关 >内存对齐的相关问题

内存对齐的相关问题

时间:2023-08-29 12:33:49浏览次数:31  
标签:字节 int char 内存 相关 对齐 sizeof



文章目录

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


标签:字节,int,char,内存,相关,对齐,sizeof
From: https://blog.51cto.com/u_6526235/7274951

相关文章

  • Linux 中的内存(cache,buffer,)
    在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。内存查看当我们使用free-h命令时,会显示如下的信息t......
  • linux swap 内存交换分区 详细介绍
    目录1、什么是SWAP,到底是干嘛的?为什么要进行内存回收?会回收的两种内存2、swappiness到底是用来调节什么的?那么这个swappiness到底起到了什么作用呢?3、kswapd什么时候会进行swap操作?4、什么是内存水位标记?(watermark)相关参数设置swap的相关操纵命令5、swap分区的优先级......
  • 记项目中的一次内存泄漏问题
    最近在使用QT开发一个大型项目,内存占用可能有点多,其中在vector.push_back()的时候报了一个segmentfault错误,感到很奇怪。因为平时遇到段错误,大多数情况下都是数组越界(使用[]访问元素),而vector的push_back()函数,在添加元素时,如果空间不足,会先向内存申请原来空间的两倍大小的新的空间......
  • VS Code 中 GIt 相关操作
    VSCode中GIt相关操作https://developer.aliyun.com/article/885528 (在这里我将使用一个空文件夹git作为项目文件进行相关的演示操作。) 本地类操作1.准备项目文件并初始化仓库    新建项目文件夹git作为项目;桌面进入GitBashHere,输入命令codegit使用......
  • 银河麒麟SP2 auditd服务内存泄露问题
    这几天遇到基于海光服务器的银河麒麟V10SP2版本操作系统出现内存无故增长问题。排查发现auditd服务,占用了大量内存。我的环境是银河麒麟V10SP2524,audit版本audit-3.0-5.se.06==5037==HEAPSUMMARY:==5037==inuseatexit:3,022bytesin210blocks==5037==to......
  • 使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(11)
    账户管理报表IoTDB可以为用户提供账号权限管理操作,保障数据安全。接下来我将通过以下具体示例向朋友们展示基本的用户权限管理操作,介绍详细的SQL语法和用法详细信息。基本概念用户用户是数据库的合法用户。用户对应于唯一的用户名,并具有密码作为身份验证方式。在使用数据库之前,一......
  • numpy中计算相关系数的np.corrcoef
    np.corrcoef的作用计算Pearson乘积矩相关系数。它可以用来分析给定数据集中各个变量之间的线性相关程度,返回一个相关系数矩阵,相关系数矩阵中的值介于-1到1之间,包括-1和1。这些值表明了变量之间的线性相关性及其方向。具体来说,正值接近1表示正向线性相关,负值接近-1......
  • 内存管理
    虚拟内存分段分页为了在多进程环境下,使得进程之间的内存地址不受影响,相互隔离,于是操作系统就为每个进程独立分配一套虚拟地址空间,每个程序只关心自己的虚拟地址就可以,实际上大家的虚拟地址都是一样的,但分布到物理地址内存是不一样的。作为程序,也不用关心物理地址的事情。那既然......
  • C++对象内存模型
    根据前面讲过的知识,C++的对象内存模型主要包含了以下几个方面的内容:如果没有虚函数也没有虚继承,那么对象内存模型中只有成员变量。如果类包含了虚函数,那么会额外添加一个虚函数表,并在对象内存中插入一个指针,指向这个虚函数表。如果类包含了虚继承,那么会额外添加一个虚基类表,......
  • 视频汇聚/视频云存储/视频监控管理平台EasyCVR安全检查的相关问题及解决方法
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的......