iOS - 内存对齐
1. 基本的内存对齐
// 对象内存对齐
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. 弱引用表的内存对齐
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. 缓存对齐
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. 内存分配对齐
// 分配内存时的对齐处理
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. 属性对齐
// 属性内存对齐
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. 优化相关的对齐
// 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. 对齐检查和处理
// 检查对齐
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. 内存对齐的优点
/*
1. 性能优化:
- 减少内存访问次数
- 提高缓存命中率
- 支持原子操作
2. 硬件要求:
- 满足处理器对齐要求
- 支持 SIMD 指令
- 优化内存访问
3. 内存效率:
- 减少内存碎片
- 优化内存布局
- 提高访问效率
*/
总结要点:
1. 对齐目的:
- 提高访问效率
- 满足硬件要求
- 支持特殊指令
2. 对齐实现:
- 属性对齐
- 结构体对齐
- 内存分配对齐
3. 优化考虑:
- 缓存行对齐
- SIMD 对齐
- 填充优化
4. 注意事项:
- 内存开销
- 平台兼容性
- 性能影响