基本数据类型在不同操作系统下的大小
C | OC | 32位 | 64位 |
---|---|---|---|
bool |
BOOL(64位) |
1 | 1 |
signed char |
(__signed char)int8_t ,BOOL(32bit)
|
1 | 1 |
unsigned char |
Boolean |
1 | 1 |
short |
int16_t |
2 | 2 |
unsigned short |
unichar |
2 | 2 |
int int32_t
|
NSInteger(32bit) boolean_t(32bit)
|
4 | 4 |
unsigned int |
boolean_t(64bit) NSUInteger(32bit)
|
4 | 4 |
long |
NSInteger(64bit) |
4 | 8 |
unsigned long |
NSUInteger(64bit) |
4 | 8 |
long long |
int64_t |
8 | 8 |
float |
CGFloat(32bit) |
4 | 4 |
double |
CGFloat(64bit) |
8 | 8 |
内存对齐原则
- 数据成员对⻬规则:结构(
struct
)(或联合(union
))的数据成员,第一个数据成员放在offset
为0
的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存储。 - 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从
其内部最大元素大小的整数倍地址开始存储.(struct a
里存有struct b
,b
里有char
,int
,double
等元素,那b
应该从8
的整数倍开始存储.) - 结构体的总大小,也就是
sizeof()
的结果,.必须是其内部最大成员的整数倍.不足的要补⻬。
For Example
struct Test {
int a; //4 0 1 2 3
float b; //4 4 5 6 7
char c; //1 8
short d; //2 9 10 11
double f; //8 12 13 14 15 |16 17 18 19 20 21 22 23
}Test; //24
2020-09-10 10:21:37.606643+0800 ZZObjc[92851:45306301] sizeof(Test) == 24
struct TestStruct {
double a; // 8 0 1 2 3 4 5 6 7
float b; // 4 8 9 10 11
struct Test c; //最大成员是f(8字节) 8 12 13 14 15 | 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
// 31 32 33 34 35 36 37 38 39
char d; // 1 40
char e; // 1 41
double f; // 8 42 43 44 45 46 47 |48 49 50 51 52 53 54 55
}TestStruct;
2020-09-10 10:21:37.606830+0800 ZZObjc[92851:45306301] sizeof(TestStruct) == 56
总结:当结构体中包含【结构体成员】或【数组】的,取元素中最大元素大小的整数倍开始存储。
总结
以上内容其实应该是C语言基础的内容,这里算是拾忆并记录下。
网友评论