当前位置:网站首页>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 .
边栏推荐
- Flink real-time data warehouse (7): Flink realizes the full pull module to extract data in MySQL
- PHP static members
- Xpt2046 four wire resistive touch screen
- Ssh/scp does not prompt all activities are monitored and reported
- Comment réaliser un graphique Nebula d'importation CSV hors ligne de niveau milliard
- Application of visualization technology in Nebula graph
- In memory of becoming the first dayu200 tripartite demo contributor
- 目标检测—利用labelimg制作自己的深度学习目标检测数据集
- Invalid bound statement (not found) solution summary
- Comprehensively interpret the background and concept of service mesh
猜你喜欢

HMS core machine learning service helps zaful users to shop conveniently

又是一年毕业季

Write your own CPU Chapter 11 - learning notes

Recommended practice sharing of Zhilian recruitment based on Nebula graph

智联招聘的基于 Nebula Graph 的推荐实践分享

Xpt2046 four wire resistive touch screen

Why does the system convert the temp environment variable to a short file name?

The outline dimension function application of small motherboard

idea 公共方法抽取快捷键

处理gzip: stdin: not in gzip formattar: Child returned status 1tar: Error is not recoverable: exitin
随机推荐
Flink real-time data warehouse (7): Flink realizes the full pull module to extract data in MySQL
将点云坐标转换成世界坐标的demo
mysql 计算经纬度范围内的数据
End time processing method of wechat v3native payment settings
Compress words (kmp/ string hash, double hash)
制作p12证书[通俗易懂]
The sea of stars hidden behind the nebula graph
Demo of converting point cloud coordinates to world coordinates
XPT2046 四线电阻式触摸屏
Pyinstaller's method of packaging pictures attached to exe
Traversal before, during and after binary tree
Boot 事务使用
Why does the system convert the temp environment variable to a short file name?
beforeEach
Practice of constructing ten billion relationship knowledge map based on Nebula graph
Fastjson list to jsonarray and jsonarray to list "suggested collections"
/Bin/ld: cannot find -lpam
(Wanzi essence knowledge summary) basic knowledge of shell script programming
Digital collection system development (program development) - Digital Collection 3D modeling economic model system development source code
愛可可AI前沿推介(7.2)