02 - 内存对齐解析-结构体嵌套结构体

2020-09-12  本文已影响0人  思路不美

一 思考

struct Person{
   int a;
   char b;
   double c;
} person;

struct People{
    char b;
    double c;
    int a;
}people;
int main ()
{
    printf ("%d\n",sizeof(people);  
   printf ("%d\n",sizeof(person);  
    return 0;
}
各类型所占内存大小

真机运行,64位系统上 char + int + double = 1 + 4 + 8 应该占12个字节 ,但运行打印后发现为24 ,16,说明系统存储相应类型有其固定方式即为内存对齐

一 为什么要内存对齐

为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问. 例如2-5 4字节数据,在没有内存对齐的情况下要取两次 0-3 4-7 才能得到2-5所需数据.

二 规则 - 如何计算

解释下上面的24 16 是如何得到的:

Person 结构结构体
计算思路
People 结构结构体
计算思路
三 结构体嵌套结构体
struct Teacher{
    char d;
    int e;
    short f;
    int g;
}teacher;

struct tClass{
    char a;
    int b;
    short c; 
    struct Teacher teacher1;
}class;

int main ()
{
    printf ("%d\n",sizeof(class); //28
    return 0;
}
计算过程

三 拓展, 应用

#pragma pack(1)
struct Person{
  int a;
  char b;
  double c;
} person;// sizeof(person) =  13
#pragma pack()

#define PACKED __attribute__((packed))
struct  PACKED People{
   char b;
   double c;
   int a;
}people;//sizeof(people) =  13

四 OC中的内存优化

OC 属性重排验证

@interface Person : NSObject

@property(nonatomic,assign)NSInteger age;

@property(nonatomic,assign)BOOL sex;

@property(nonatomic,copy)NSString *name;

@property(nonatomic,copy)NSString *address;

@end

-声明一个对象Person 其属性顺序如上

   Person *person = [[Person alloc] init];
   person.name = @"范热热";
   person.address = @"li bed";
   person.age = 100;
   person.height = 400;
   person.a = 'f';
   person.b = 'b';
  
   NSLog(@"objc对象类型占用的内存大小:%lu",sizeof(person));
   NSLog(@"objc对象实际占用的内存大小:%lu",class_getInstanceSize([Person class]));
   NSLog(@"objc对象分配的内存大小:%lu",malloc_size((__bridge const void*)(person)));
  

查看打印结果 为 8 40 48

上一篇 下一篇

猜你喜欢

热点阅读