当前位置:网站首页>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 .
边栏推荐
- 注册成为harmonyos开发者并安装DevEco Studio 3.0 Beta2 for HarmonyOS
- Pattern matching extraction of specific subgraphs in graphx graph Computing Practice
- QVariant与Json的各种纠葛——Qt
- XPT2046 四线电阻式触摸屏
- [Xiaobai chat cloud] suggestions on container transformation of small and medium-sized enterprises
- Floyed "suggestions collection"
- Write your own CPU Chapter 11 - learning notes
- Demo of converting point cloud coordinates to world coordinates
- Comparison between rstan Bayesian regression model and standard linear regression model of R language MCMC
- win10系统升级一段时间后,内存占用过高
猜你喜欢

Experiment collection of University "Fundamentals of circuit analysis". Experiment 4 - Research on linear circuit characteristics

Comparison between rstan Bayesian regression model and standard linear regression model of R language MCMC

2020.4.12 byte written test questions B DP D monotone stack

Experiment collection of University Course "Fundamentals of circuit analysis". Experiment 5 - Research on equivalent circuit of linear active two terminal network

《大学“电路分析基础”课程实验合集.实验七》丨正弦稳态电路的研究

【5G NR】RRC连接释放

Ant group's large-scale map computing system tugraph passed the national evaluation

Tree binary search tree

原神2.6服务端下载以及搭建安装教程

去除router-link中的下划线
随机推荐
Usage of group by
(Wanzi essence knowledge summary) basic knowledge of shell script programming
Strings and arrays
Register as a harmonios developer and install deveco studio 3.0 beta2 for harmonios
Introduction to Dynamic Planning II (5.647.62)
仙人掌之歌——投石问路(3)
/Bin/ld: cannot find -lcrypto
[idea] recommend an idea translation plug-in: translation "suggestions collection"
The difference and usage of calloc, malloc and realloc functions
由ASP.NET Core根据路径下载文件异常引发的探究
蚂蚁集团大规模图计算系统TuGraph通过国家级评测
Boot 连接 Impala数据库
Boot transaction usage
Multi data source configuration code
HMS core machine learning service helps zaful users to shop conveniently
死锁的条件及解决方法
Pyinstaller打包exe附带图片的方法
Comprehensively interpret the background and concept of service mesh
After the win10 system is upgraded for a period of time, the memory occupation is too high
Astra: could not open "2bc5/ [email protected] /6“: Failed to set USB interface