【发布时间】:2017-02-05 11:34:57
【问题描述】:
如何获得指向页面开头的指针?
我尝试了以下没有成功:
#define PAGESIZE 4096
bool is_page_aligned(void *p)
{
return !((long int)p & 0xFFF);
}
int main(void)
{
bool res;
void *buffer;
buffer = malloc(PAGESIZE*2);
printf("%p\n", (void *) &buffer);
res = is_page_aligned(&buffer);
fputs(res ? "true\n" : "false\n", stdout);
return 0;
}
我正在尝试减少 TLB 未命中。非常感谢任何可能的帮助。
【问题讨论】:
-
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
-
您正在检查变量
buffer的位置是否是页面对齐的,而不是buffer指向的内存。 -
首先:您的代码调用未定义的行为。至少使用正确的整数类型对指针进行算术运算(它仍然是 UB,但更有可能在您的平台上工作)。
-
另外,您的问题是关于获取指向页面开头的指针,但您显示的代码并没有这样做,它只是检查指针是否以某种特定方式对齐。
-
@Olaf,在指针和整数之间转换的行为是实现定义,前提是整数类型足够大以容纳指针的转换值。