You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算大于指定大小的页大小倍数并使用aligned_alloc替代pvalloc?

计算buffer_size的逻辑

要得到大于等于sizeof(MyObject)的最小页大小倍数,可使用向上取整到页边界的经典计算方式:将目标大小加上页大小减一,再做整数除法取商,最后乘以页大小。这样能确保结果刚好是足够容纳MyObject的最小页对齐尺寸。

补全后的代码如下:

#include <unistd.h>   // 用于sysconf
#include <stdlib.h>   // 用于aligned_alloc、memset、exit
#include <sys/mman.h> // 用于mprotect
#include <stdio.h>    // 用于perror

// 获取页大小,sysconf返回long类型,需转为size_t
static const size_t page_size = (size_t)sysconf(_SC_PAGE_SIZE);

// 计算最小的页对齐buffer大小
static const size_t buffer_size = ((sizeof(MyObject) + page_size - 1) / page_size) * page_size;

MyObject *ptr = aligned_alloc(page_size, buffer_size);
if (ptr == NULL) {
    perror("aligned_alloc failed");
    exit(EXIT_FAILURE);
}
memset(ptr, 0, buffer_size); // 修正原代码中"pcj"的拼写错误

// 按需修改内存内容...

// 设置只读保护
if (mprotect(ptr, buffer_size, PROT_READ) == -1) {
    perror("mprotect failed");
    free(ptr);
    exit(EXIT_FAILURE);
}

关键说明:

  • 向上取整公式:((X + Y - 1) / Y) * Y 是C中对正整数X向上取整到Y的倍数的标准写法,这里X是sizeof(MyObject),Y是page_size。
  • 类型安全:sysconf(_SC_PAGE_SIZE)返回long,强制转换为size_t以匹配内存分配函数的参数类型。
  • 错误处理:添加了aligned_alloc和mprotect的错误检查,避免忽略分配或保护失败的情况。

内容的提问来源于stack exchange,提问作者firebush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:30:53