iOS - 内存对齐

1. 基本的内存对齐

objectivec 复制代码
// 对象内存对齐
struct objc_object {
    // isa 指针 8 字节对齐
    isa_t isa __attribute__((aligned(8)));
};

// 定义对齐常量
#define WORD_MASK 7UL            // 字对齐掩码
#define WORD_SHIFT 3UL           // 字对齐位移
#define WORD_SIZE 8              // 64位系统下字的大小

2. 弱引用表的内存对齐

objectivec 复制代码
struct weak_entry_t {
    // 确保指针对齐
    DisguisedPtr<objc_object> referent;
    
    union {
        struct {
            // 确保引用数组对齐
            weak_referrer_t *referrers;
        };
        struct {
            // 内联数组对齐
            weak_referrer_t inline_referrers[WEAK_INLINE_COUNT];
        };
    };
};

// 弱引用表大小对齐
static size_t aligned_size() {
    return (size + WORD_MASK) & ~WORD_MASK;
}

3. 缓存对齐

objectivec 复制代码
struct cache_t {
    // bucket 数组对齐
    struct bucket_t *_buckets __attribute__((aligned(CACHE_LINE_SIZE)));
    
    // 掩码对齐优化
    mask_t _mask;  // 总是 2^n - 1
    
    // 计算对齐的大小
    static size_t bytesForCapacity(uint32_t cap) {
        return sizeof(bucket_t) * cap + sizeof(cache_t);
    }
};

4. 内存分配对齐

objectivec 复制代码
// 分配内存时的对齐处理
void *calloc(size_t count, size_t size) {
    // 计算对齐后的大小
    size_t alignedSize = (size + WORD_MASK) & ~WORD_MASK;
    
    // 分配对齐的内存
    void *result = malloc(count * alignedSize);
    if (result) {
        // 清零
        bzero(result, count * alignedSize);
    }
    return result;
}

5. 属性对齐

objectivec 复制代码
// 属性内存对齐
struct property_t {
    const char *name;
    const char *attributes;
} __attribute__((aligned(WORD_SIZE)));

// 确保属性列表对齐
struct property_list_t {
    uint32_t count;
    uint32_t size;
    property_t first;  // 这里开始的属性数组会自动对齐
};

6. 优化相关的对齐

objectivec 复制代码
// 1. CPU 缓存行对齐
#define CACHE_LINE_SIZE 64
struct cache_aligned_t {
    // 确保数据在缓存行边界上对齐
    char data[32] __attribute__((aligned(CACHE_LINE_SIZE)));
};

// 2. SIMD 指令对齐
struct simd_data {
    // 16字节对齐用于 SIMD 指令
    float values[4] __attribute__((aligned(16)));
};

7. 对齐检查和处理

objectivec 复制代码
// 检查对齐
static inline bool isAligned(const void *ptr, size_t alignment) {
    return (((uintptr_t)ptr) & (alignment - 1)) == 0;
}

// 计算对齐填充
static inline size_t alignmentPadding(size_t size, size_t alignment) {
    return (alignment - (size & (alignment - 1))) & (alignment - 1);
}

8. 内存对齐的优点

objectivec 复制代码
/*
1. 性能优化:
   - 减少内存访问次数
   - 提高缓存命中率
   - 支持原子操作

2. 硬件要求:
   - 满足处理器对齐要求
   - 支持 SIMD 指令
   - 优化内存访问

3. 内存效率:
   - 减少内存碎片
   - 优化内存布局
   - 提高访问效率
*/

总结要点:

  1. 对齐目的:
  • 提高访问效率
  • 满足硬件要求
  • 支持特殊指令
  1. 对齐实现:
  • 属性对齐
  • 结构体对齐
  • 内存分配对齐
  1. 优化考虑:
  • 缓存行对齐
  • SIMD 对齐
  • 填充优化
  1. 注意事项:
  • 内存开销
  • 平台兼容性
  • 性能影响
相关推荐
茶底世界之下8 小时前
iPhone Duo 适配实战,Awaking 踩过的 8 个坑
ios·swiftui·swift
跨境数据猎手9 小时前
HTTP 响应体编码与压缩:识别、解码
网络协议·http·ios
也非非也9 小时前
iPhone 中国区 AI 落地:Apple 与阿里千问合作的技术观察
大数据·人工智能·ios·agent·iphone·智子
茶底世界之下10 小时前
同一片泳池,清透还是奶油胶片?用 Awaking 做两版成片
ios
2501_9160088913 小时前
iOS App 图标、启动屏和多语言搭配 方法,上架前使用KXBuild一次做好 App 图标
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
沐梯子13 小时前
MOSS-Transcribe-Diarize 和豆包语音识别哪个好?多人会议录音转写的准确率与说话人归属对比
人工智能·语音识别·xcode
2501_9159184113 小时前
iOS 推送通知怎么实现,从 APNs p8 密钥到 iOS 真机收到第一条推送
vscode·ios·objective-c·个人开发·swift·敏捷流程
茶底世界之下1 天前
雨夜街角裁成方图,人物与冷暖光还能共存吗?
ios
youdexiang1 天前
IOS录音APP拍照记录能和音频同步吗
ios·音视频
2501_915909062 天前
Windows 打开 Xcode 工程,编译调试 Xcode 项目并和 Mac 同事协作
ide·windows·vscode·macos·ios·个人开发·xcode