golang 和 C++的內(nèi)存對(duì)齊鳍寂,基本一致拟烫,記住規(guī)則和對(duì)應(yīng)類型的 size 即可
內(nèi)存對(duì)齊規(guī)則
- 有效對(duì)齊值是固定值和結(jié)構(gòu)體中最長(zhǎng)數(shù)據(jù)類型長(zhǎng)度中較小的那個(gè)列敲。固定值系統(tǒng)默認(rèn)為 32 位是 4, 64 位是 8荚孵,
#pragma pack(n)
設(shè)置了則是對(duì)應(yīng)的 n掷倔。 - 結(jié)構(gòu)體第一個(gè)成員的 offset 為 0较剃,以后每個(gè)成員相對(duì)于結(jié)構(gòu)體首地址的 offset 都是
min{該成員大小, 有效對(duì)齊值}
的整數(shù)倍咕别,如有需要編譯器會(huì)在成員之間加上填充字節(jié)。 - 結(jié)構(gòu)體的總大小為 有效對(duì)齊值 的整數(shù)倍写穴,如有需要編譯器會(huì)在最末一個(gè)成員之后加上填充字節(jié)惰拱。
C++內(nèi)存對(duì)齊
常見(jiàn)類型占用內(nèi)存大小
類型/編譯器 | 16 位編譯器 | 32 位編譯器 | 64 位編譯器 |
---|---|---|---|
bool | 1 | 1 | 1 |
char | 1 | 1 | 1 |
char* | 2 | 4 | 8 |
int | 2 | 4 | 4 |
float | 4 | 4 | 4 |
double | 8 | 8 | 8 |
long long | 8 | 8 | 8 |
例子
#include <iostream>
#include <stdint.h>
using namespace std;
// #pragma pack(4)
class Part1 {
bool a;
int32_t b;
int8_t c;
int64_t d;
char e;
};
class Part2 {
char e;
int8_t c;
bool a;
int32_t b;
int64_t d;
};
int main(void){
Part1 part1;
Part2 part2;
printf("part1 size: %zu\n", sizeof(part1));
printf("part2 size: %zu\n", sizeof(part2));
}
// output:
// part1 size: 32, if pack(4): part1 size: 24
// part2 size: 16
golang 內(nèi)存對(duì)齊
常見(jiàn)類型占用內(nèi)存大小
類型/編譯器 | 64 位編譯器 |
---|---|
bool | 1 |
byte | 1 |
uintptr | 8 |
int | 8 |
float64 | 8 |
string | 16 |
例子
package main
import (
"fmt"
"unsafe"
)
type Part1 struct {
a bool
b int32
c int8
d int64
e byte
}
type Part2 struct {
e byte
c int8
a bool
b int32
d int64
}
func main() {
part1 := Part1{}
part2 := Part2{}
fmt.Printf("part1 size: %d, align: %d\n", unsafe.Sizeof(part1), unsafe.Alignof(part1))
fmt.Printf("part2 size: %d, align: %d\n", unsafe.Sizeof(part2), unsafe.Alignof(part2))
}
// part1 size: 32, align: 8
// part2 size: 16, align: 8
例子分析
僅討對(duì)齊固定值為 8 時(shí) Part1 的情況,例子中的 a,b,c,d,e 占用大小分別為 1,4,1,8,1啊送。填充字節(jié)用 0 表示偿短,|之間表示 8 字節(jié)空間:
- a 偏移為 0,|a...
- b 偏移為 4 的整數(shù)倍馋没,|a000b|...
- c 偏移為 1 的整數(shù)倍昔逗,|a000b|c...
- d 偏移為 8 的整數(shù)倍,|a000b|c0000000|d|...
- e 偏移為 1 的整數(shù)倍篷朵,|a000b|c0000000|d|e...
- 整個(gè)結(jié)構(gòu)體對(duì)齊勾怒,補(bǔ)齊為 8 的整數(shù)倍婆排,|a000b|c0000000|d|e0000000|
- 得出總大小為 32