目录

一  OC  中的内存分配


一  OC  中的内存分配

student 结构体明明是20?为什么是24个字节,因为结构体会按照本身成员变量最大的内存进行对齐,最大成员变量是8个字节,因此就是8的倍数,24个字节。

class_getInstanceSize 返回的是该类内存对齐之后的成员变量的内存空间,你需要多少,计算多少。

malloc_size  是实际系统分配的内存空间

#import <Foundation/Foundation.h>#import <objc/runtime.h>
#import <malloc/malloc.h>// 模拟 NSObject 的实现
struct NSObject_IMPL
{Class isa;
};// 模拟Student 的实现
struct Student_IMPL
{struct NSObject_IMPL IVARS;// 8int _no;// 4int _age;// 4int _height;// 4
}; // 以上实际是20个字节,由于必须是8的倍数,所以是24个字节@interface Student:NSObject
{@publicint _no;int _age;int _height;
}@end@implementation Student@endint main(int argc, const char * argv[]) {@autoreleasepool {// insert code here...Student *stu1 = [[Student alloc]init];// 24NSLog(@"%zd",sizeof(struct Student_IMPL)); // 24 - 32NSLog(@"%zd -- %zd",class_getInstanceSize([Student class]),malloc_size((__bridge const void *)(stu1)));}return 0;
}

虽然结构体只需要24个字节,可以看出来student 实例对象占用的字节是32个字节

前面也有讲到  allozWithZone 方法调用中

    inline size_t instanceSize(size_t extraBytes) const {if (fastpath(cache.hasFastInstanceSize(extraBytes))) {return cache.fastInstanceSize(extraBytes);}// extraBytes 一般是传递的是0size_t size = alignedInstanceSize() + extraBytes;// CF requires all objects be at least 16 bytes.if (size < 16) size = 16;return size;}id
_class_createInstanceFromZone(Class cls, size_t extraBytes, void *zone)
{void *bytes;size_t size;// Can't create something for nothingif (!cls) return nil;// Allocate and initializesize = cls->alignedInstanceSize() + extraBytes;// CF requires all objects be at least 16 bytes.if (size < 16) size = 16;if (zone) {bytes = malloc_zone_calloc((malloc_zone_t *)zone, 1, size);} else {// 这个位置传递的就是24,但是实际分配的内存确实32,所以还是要看calloc 底层的实现bytes = calloc(1, size);}return objc_constructInstance(cls, bytes);
}

calloc 的源码实现,去苹果源码开源下载 找到malloc 的源码包文件

、https://opensource.apple.com/tarballs/libmalloc/

在 malloc.c 文件中找到的calloc 函数的实现

void *
calloc(size_t num_items, size_t size)
{void *retval;retval = malloc_zone_calloc(default_zone, num_items, size);if (retval == NULL) {errno = ENOMEM;}return retval;
}void *
malloc_zone_calloc(malloc_zone_t *zone, size_t num_items, size_t size)
{void *ptr;size_t alloc_size;if (malloc_check_start && (malloc_check_counter++ >= malloc_check_start)) {internal_check();}if (os_mul_overflow(num_items, size, &alloc_size) || alloc_size > MALLOC_ABSOLUTE_MAX_SIZE){errno = ENOMEM;return NULL;}ptr = zone->calloc(zone, num_items, size);if (malloc_logger) {malloc_logger(MALLOC_LOG_TYPE_ALLOCATE | MALLOC_LOG_TYPE_HAS_ZONE | MALLOC_LOG_TYPE_CLEARED, (uintptr_t)zone,(uintptr_t)(num_items * size), 0, (uintptr_t)ptr, 0);}return ptr;
}

以上说了那么多,这这个源码中有一个 NANO_MAX_SIZE 这个宏定义,堆上分配内存的时候,系统把一块块内存都划分好的

即使你不够16个字节,也给你分配16个字节,这里都是16的倍数。

#define NANO_MAX_SIZE            256 /* Buckets sized {16, 32, 48, 64, 80, 96, 112, ...} */

所以以上结构体只需要24个字节,但是系统就是分配给你32个字节的内存

4 OC 中的内存分配以及内存对齐相关推荐

  1. C/C++内存分配、内存区划分、常量存储区、堆、栈、自由存储区、全局区(静态区)、代码区

    C/C++内存分配.内存区划分.常量存储区.堆.栈.自由存储区.全局区 C++中,内存分成几个区: 栈(stack) 堆(heap) 自由存储区 全局/静态存储区 常量存储区 代码区 对于C++的内存 ...

  2. 【C进阶】之动态内存分配及内存操作函数

    动态内存分配及内存操作函数 1 动态内存分配的介绍 2 malloc和free函数 3 测试代码 4 goto的使用场合,常用于出错处理 5 memset() 6 memcpy() 7 memcmp( ...

  3. 函数中的指针分配的内存怎么释放

     被调用函数里动态分配的内存要不要手动释放 20 我想手动释放来着,但是指针是在被调用函数里声明的,在调用函数里释放不了. 我的被调用函数返回的就是这个指针,我也不能在被调用函数里释放. 你指的& ...

  4. 内存分配_go内存分配管理

    基本分配单元 class和span go内存管理粒度是8KB(在大多数操作系统中,一个page大小为4KB,对于go来说,也就是两个page),可以理解为在go中page是8KB大小,每次go分配一个 ...

  5. JVM自动化的内存分配与内存回收

    如何区分一个C++程序员和Java程序员?答案是看他吃饭完收不收拾碗筷,反正我是不收拾,哈哈哈哈哈哈. Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回 ...

  6. 动态内存分配导致内存泄漏之处

    摘要:举了几个动态内存分配过程中,发生内存泄漏的例子 1. 分配了内存,却没有及时删除,导致泄漏 1: void doSomething() 2: { 3: int *pnValue = new in ...

  7. java 常量 内存分配_Java内存分配之堆、栈和常量池

    寄存器:最快的存储区,位于不同于其他存储区的地方--处理器内部.寄存器的数量极其有限,所以寄存器由编译器根据需求 进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象. 栈:存放基本类型 ...

  8. 秘境探索之一个.NET 对象从内存分配到内存回收

    前方高能预警,新手慎入!不听劝阻者,轻则郁闷堆积,重则生死看淡,对编程失去了念想,对生活失去了幻想!好了,心理强大到NB的可以忽略前方若干警示.为了探索.NET对象的内存分配和回收销毁,您可能需要准备 ...

  9. java map 内存分配_mapreduce 内存分配

    稍微有点mapreduce使用经验的同学肯定对OOM不陌生,对的,我目前在mapReduce里面遇到的最多的报错也是内存分配出错,所以看到好多hadoop执行脚本里面有好多关于内存的参数,虽然是知道和 ...

最新文章

  1. java常用类型转换
  2. 华为路由器上有没有mac表_MAC地址表、ARP缓存表、路由表及交换机、路由器基本原理...
  3. 云原生数据库POLARDB专场“硬核”解析
  4. ubuntu的两种网络连接模式
  5. 单片机c语言编程RGB,C语言将raw data(rgb/rgba)写成bmp文件(bmp24或32)
  6. VB讲课笔记03:对象及其操作
  7. 谷歌将推出新版Pixel 4a 5G:搭载骁龙765G处理器 售价下降至3200元
  8. 简单设计企业级JOB平台
  9. VTK:图像平滑——中值滤波器
  10. Python网络爬虫经典书籍推荐
  11. python代码案例详解-Python代码样例列表
  12. 未知的软件异常0xc0000409解决办法
  13. android studio连接本地SqlServer数据库报网络错误
  14. 河南省第二类医疗器械首次注册
  15. wps怎么将图片嵌入文字里_wps文档怎么把图片嵌入
  16. [蓝桥杯]校内培训交流会总结
  17. 数字图像处理:数值图像的文件格式总结
  18. RDP、VNC、SPICE协议性能分析之网络带宽
  19. 治疗性经颅磁刺激后大规模脑电图神经网络的变化
  20. 什么是CDN什么是高防CDN

热门文章

  1. BZOJ4766: 文艺计算姬
  2. 洛谷p1162填涂颜色(dfs写法)
  3. Codeforces 460E Roland and Rose(暴力)
  4. 网页中;window.onerror=function(){return!0};
  5. 2016.04.09 使用Powerdesigner进行创建数据库的概念模型并转为物理模型
  6. B树,B+树,B-树和B*树
  7. SLAM之特征匹配(二)————RANSAC--------翻译以及经典RANSAC以及其相关的改进的算法小结
  8. VML 画统计 柱状、饼图、折线
  9. c语言中int和指针和字符所占字节
  10. Windows客户端C/C++编程规范“建议”——结构