当前位置:网站首页>Memory alignment of structure
Memory alignment of structure
2022-07-02 16:02:00 【Hero 2021】
List of articles
Memory alignment of structures is a Especially popular Knowledge points of !
Cited example :
#include<iostream>
using namespace std;
struct S
{
char c; // 1
int a; // 4
char d; // 1
};
int main()
{
struct S s = {
'a',2,'y'};
cout << sizeof(struct S) << endl;// 12
cout << sizeof(s) << endl; // 12
return 0;
}
Structure memory alignment rules
1. Structure of the The first variable , Always put it at the beginning of the structure The offset for the 0 The place of .
2. Structural members Start with the second member , The remaining members are always placed at an offset of an integer multiple of the alignment number .
Align numbers = The compiler's default alignment number is the smaller value of the variable's own size (VS The default number of alignments is 8,Linux There is no default alignment number )
3. The total size of the structure , It must be an integer multiple of the maximum number of alignments in each member of the structure
4. If nesting The situation of the structure , The nested structure is aligned to an integral multiple of its maximum alignment , The overall size of the structure is the maximum number of alignments ( The number of alignments with nested structures ) Integer multiple .
Meet the first point :
Meet the second point :

Meet the third step :

In order to meet the third point , We need memory alignment , The total size of the structure must be 4 Multiple , Now only 12 It can meet the requirements .
But we have some Waste of space ah !
So why have memory alignment ?
Most of the references say that :
- Platform reasons ( Reasons for transplantation ):
Not all hardware platforms can access any data on any address ; Some hardware platforms can only access certain types of data at certain addresses , Otherwise, a hardware exception will be thrown .- Performance reasons :
data structure ( Especially stacks ) It should be aligned as far as possible on the natural boundary .
The reason lies in , To access unaligned memory , The processor needs to make two memory accesses ; The aligned memory access only needs one access .
for example : Some scenes can only be read at a time 4byte Space : Compare alignment and misalignment , There may be errors when reading data .
On the whole :
The memory alignment of the structure is Trade space for time How to do it .
How to optimize ?
When designing structures , We have to satisfy the alignment , And save space , How to do it ? That is to let Members with small space shall be gathered together as much as possible .
// for example :
struct S1
{
char c1;
int i;
char c2;
};
struct S2
{
char c1;
char c2;
int i;
};
S1 and S2 The type of members as like as two peas , however S1 and S2 There are some differences in the amount of space taken up .
Change the default alignment number
use #pragma Change the default alignment number
#include <stdio.h>
#pragma pack(8)// Set the default alignment number to 8
struct S1
{
char c1;
int i;
char c2;
};
#pragma pack()// Unset the default number of alignments , Restore to default
#pragma pack(1)// Set the default alignment number to 1
struct S2
{
char c1;
int i;
char c2;
};
#pragma pack()// Unset the default number of alignments , Restore to default
int main()
{
// What is the result of the output ?
printf("%d\n", sizeof(struct S1));
printf("%d\n", sizeof(struct S2));
return 0;
}
Conclusion :
When the structure is not aligned properly , We can change the default alignment number by ourselves .
边栏推荐
- Boot 连接 Impala数据库
- Multi data source configuration code
- Target detection - make your own deep learning target detection data set with labelimg
- Figure database | Nepal graph v3.1.0 performance report
- /Bin/ld: cannot find -lxml2
- 数据库系统概论第一章简答题-期末考得怎么样?
- 中科大脑知识图谱平台建设及业务实践
- 目标检测—利用labelimg制作自己的深度学习目标检测数据集
- C # get PLC information (kepserver) II
- Write your own CPU Chapter 11 - learning notes
猜你喜欢

又是一年毕业季

How to import a billion level offline CSV into Nepal graph

注册成为harmonyos开发者并安装DevEco Studio 3.0 Beta2 for HarmonyOS

Maui学习之路(三)--Winui3深入探讨

Introduction to dynamic planning I, BFS of queue (70.121.279.200)

去除router-link中的下划线

Recommended practice sharing of Zhilian recruitment based on Nebula graph

Crawl the information of national colleges and universities in 1 minute and make it into a large screen for visualization!

愛可可AI前沿推介(7.2)

Boot 事务使用
随机推荐
制作p12证书[通俗易懂]
仙人掌之歌——投石问路(3)
《大学“电路分析基础”课程实验合集.实验四》丨线性电路特性的研究
数据库系统概论第一章简答题-期末考得怎么样?
QVariant与Json的各种纠葛——Qt
Add user-defined formula (time sharing t+0) to mobile app access as an example
构建多架构镜像的最佳实践
华为云服务器安装mysqlb for mysqld.service failed because the control process exited with error code.See “sys
(Wanzi essence knowledge summary) basic knowledge of shell script programming
Another graduation season
Maui学习之路(三)--Winui3深入探讨
又是一年毕业季
由ASP.NET Core根据路径下载文件异常引发的探究
Astra: could not open "2bc5/ [email protected] /6“: Failed to set USB interface
Review materials for the special topic of analog electronics with all essence: basic amplification circuit knowledge points
Why does the system convert the temp environment variable to a short file name?
The difference and usage of calloc, malloc and realloc functions
Group by的用法
The task cannot be submitted after the installation of flick is completed
Pyobject to char* (string)