当前位置:网站首页>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 .
边栏推荐
- [solution] educational codeforces round 82
- Bean configuration override in boot
- Pyobject to char* (string)
- [fluent] dart language (DART language features | JIT instant compilation | AOT static compilation)
- 全方位解读服务网格(Service Mesh)的背景和概念
- Soul torture, what is AQS???
- /Bin/ld: cannot find -lpam
- Group by的用法
- Armv8-a programming guide MMU (4)
- GraphX 图计算实践之模式匹配抽取特定子图
猜你喜欢

Add user-defined formula (time sharing t+0) to mobile app access as an example

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

解决** WARNING ** : Your ApplicationContext is unlikely to start due to a @ComponentScan of the defau

Soul torture, what is AQS???

可视化技术在 Nebula Graph 中的应用

手机app通达信添加自定义公式(分时T+0)为例子讲解

Idea public method extraction shortcut key

Idea jar package conflict troubleshooting

Teach you how to build virtual machines locally and deploy microservices

Armv8-a programming guide MMU (4)
随机推荐
Idea public method extraction shortcut key
Practice of constructing ten billion relationship knowledge map based on Nebula graph
[2. Basics of Delphi grammar] 3 Object Pascal constants and variables
GraphX 图计算实践之模式匹配抽取特定子图
源码look me
制作p12证书[通俗易懂]
Leetcode -- number of palindromes
结构体的内存对齐
Flink real-time data warehouse (7): Flink realizes the full pull module to extract data in MySQL
Locate: cannot execute stat() `/var/lib/mlocate/mlocate Db ': there is no such file or directory
Use ffmpeg command line to push UDP and RTP streams (H264 and TS), and ffplay receives
PHP static members
手机app通达信添加自定义公式(分时T+0)为例子讲解
Postgressql stream replication active / standby switchover primary database no read / write downtime scenario
QVariant与Json的各种纠葛——Qt
Experiment collection of University "Fundamentals of circuit analysis". Experiment 4 - Research on linear circuit characteristics
纪念成为首个 DAYU200 三方 demo 贡献者
JS learning notes - first acquaintance
How to import a billion level offline CSV into Nepal graph
beforeEach