当前位置:网站首页>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 .
边栏推荐
- GraphX 图计算实践之模式匹配抽取特定子图
- /Bin/ld: cannot find -lgssapi_ krb5
- 【小白聊云】中小企业容器化改造建议
- C # get PLC information (kepserver) II
- Solve the problem of base64encoder error
- 华为云服务器安装mysqlb for mysqld.service failed because the control process exited with error code.See “sys
- 通过两级网关设计来路由服务网格流量
- In memory of becoming the first dayu200 tripartite demo contributor
- Pattern matching extraction of specific subgraphs in graphx graph Computing Practice
- /Bin/ld: cannot find -lssl
猜你喜欢

《大学“电路分析基础”课程实验合集.实验五》丨线性有源二端网络等效电路的研究

idea jar包冲突排查

Application of visualization technology in Nebula graph

处理gzip: stdin: not in gzip formattar: Child returned status 1tar: Error is not recoverable: exitin

The sea of stars hidden behind the nebula graph

Practice of constructing ten billion relationship knowledge map based on Nebula graph

GraphX 图计算实践之模式匹配抽取特定子图

End time processing method of wechat v3native payment settings

全是精华的模电专题复习资料:基本放大电路知识点

win10系统升级一段时间后,内存占用过高
随机推荐
Boot 中bean配置覆盖
Conditions and solutions of deadlock
Experiment collection of University "Fundamentals of circuit analysis". Experiment 4 - Research on linear circuit characteristics
Data Lake (11): Iceberg table data organization and query
Dimension table and fact table in data warehouse
Flink real-time data warehouse (IX): incremental synchronization of data in MySQL
lseek 出错
/Bin/ld: cannot find -lpam
idea jar包冲突排查
SQL FOREIGN KEY
HMS core machine learning service helps zaful users to shop conveniently
SQL modification statement
Why does the system convert the temp environment variable to a short file name?
Mobile web development learning notes - Layout
多数据源配置代码
[Xiaobai chat cloud] suggestions on container transformation of small and medium-sized enterprises
Wise target detection 23 - pytoch builds SSD target detection platform
去除router-link中的下划线
/Bin/ld: cannot find -llz4
/Bin/ld: cannot find -lcrypto