内存分配
内存分配相关的函数
1. malloc
malloc 是 C 语言标准库中的动态内存分配函数,用于在堆(heap)区分配指定大小的内存块。
#include <stdlib.h>
void* malloc(size_t size);
参数说明
- size: 要分配的字节数
返回值
- 成功:返回指向分配内存起始地址的指针(类型为 void*)
- 失败:返回 NULL
#include <stdio.h>
#include <stdlib.h>
int main() {
    // 分配内存
    int* arr = (int*)malloc(10 * sizeof(int));
    if (arr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }
    // 使用内存
    for (int i = 0; i < 10; i++) {
        arr[i] = i * 10;
    }
    // 打印结果
    for (int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    // 释放内存
    free(arr);
    return 0;
}
2. free
free()释放内存,calloc()分配并清零内存,realloc()调整已分配内存的大小。
[!NOTE]
free()只能释放一个连续内存空间。
3. _mm_malloc
_mm_malloc 是 Intel 提供的内存分配函数,主要用于分配对齐的内存块,特别适用于需要 SSE/AVX 等 SIMD 指令集优化的场景。
void* _mm_malloc(size_t size, size_t align);
参数说明
- size: 要分配的字节数
- align: 对齐边界,必须是 2 的幂次方,且至少为 sizeof(void*)
#include <stdio.h>
#include <emmintrin.h>  // 需要包含这个头文件
int main() {
    // 分配 64 字节内存,按 16 字节对齐(SSE 要求)
    float* aligned_data = (float*)_mm_malloc(64, 16);
    if (aligned_data != NULL) {
        // 使用对齐的内存进行 SIMD 操作
        __m128 vec = _mm_load_ps(aligned_data);  // 安全加载,不会段错误
        // ... 处理数据
        printf("create memory\n");
        _mm_free(aligned_data);  // 必须使用配套的释放函数
    }
    return 0;
}
16字节对齐,适用于SSE指令集;32字节对齐,适用于AVX指令集;64字节对齐,适用于AVX-512指令集。对齐值必须是 2 的幂次方。
// 标准 malloc - 对齐不确定
void* data1 = malloc(64);  // 对齐可能不是16字节
// _mm_malloc - 保证对齐
void* data2 = _mm_malloc(64, 16);  // 保证16字节对齐
必须使用 _mm_free 释放,不能使用 free()。需要包含 <emmintrin.h> 或 <xmmintrin.h> 头文件
4. _mm_free
void _mm_free(void* ptr);
malloc与 _mm_malloc 的区别
| 特性 | malloc | _mm_malloc | 
|---|---|---|
| 标准性 | C 标准函数 | 编译器扩展 | 
| 对齐 | 实现定义 | 指定对齐 | 
| 释放 | 使用 free() | 使用 _mm_free() | 
| 用途 | 通用内存分配 | SIMD/特定对齐需求 |