gpt4 book ai didi

c - 我怎么知道指针中有多少空闲位?

转载 作者:行者123 更新时间:2023-12-04 11:41:06 26 4
gpt4 key购买 nike

编辑:我问的原因
我想我必须澄清我正在使用的平台以及我要求让您更轻松地回答这个问题的原因:我正在使用带有 gcc 和 Ubuntu 的 x86_64 机器,我正在研究一些玩具语言的解释器我认为标记指针是一个可以使用的巧妙技巧。我知道苹果正在使用它。所以我只想尝试一下。

我正在阅读有关标记指针的内容,我想知道如何知道特定机器上的指针中有多少空闲位。
现在我的理解是,如果我使用的是 64 位机器,那么在访问内存时,CPU 将始终访问 8 字节倍数的内存地址。所以它在指针末尾留下 2 位始终设置为 0。此外,如果在 x86_64 机器上,前 14 位将始终为 0,对吗?因为它们从未被 CPU 使用。 malloc将确保它返回的指针始终对齐。但是其他内存位置呢?说堆栈上的变量?
我怎样才能确认这一点?
评论里有人说我上面提到的2位不对,说明我是一个糟糕的程序员。我不否认我不是一个非常专业的程序员,但我想我会解释一下为什么我说 2 而不是 3。
我写了一个非常简单的程序,如下所示:

 #include <stdio.h>
#include <stdlib.h>
int main() {
int a = 0;
printf("%p\n", &a);
int *p = malloc(sizeof(int));
printf("%p\n", p);
}
我用 gcc 编译它并在带有 Ubuntu 的 64 位机器上运行它超过 10000 次迭代。我发现 &a总是以最后 4 位结束 1100而 p 总是以 0000 结尾,所以我想对编译器实际未使用多少位保持保守。这就是为什么我说 2 而不是 3。
另外,如果您能帮我解释我所观察到的内容( &a 以 1100 结束,其中只有 2 位设置为 0),我将不胜感激。

最佳答案

许多人建议不要在指针中使用标记位(我也是如此)。

如果您坚持这样做,请仅使用指针的两个(或三个)最低位,最好编写自己的 malloc -like 分配器来确保它。

在现代 x86-64 处理器上,大多数指针(例如指向 malloc 区域的指针,或指向字对齐数据的指针)通常是字对齐的,这意味着它们是 8 的倍数(因为 64 位字有 8 个字节)。

其实不仅仅是处理器,还有ABI具体的。一些 ABI 要求一个 16 字节对齐的堆栈指针(以帮助 SSE 或 AVX),其他的只需要 8 字节对齐。

不要指望地址的高位是固定的。实际上它们通常是,但这是特定于处理器的(在高端 Intel Xeon 和低端 FS1b AMD 处理器上可能略有不同,并且在不久的将来处理器中可能会有所不同)。

顺便说一句,这是操作系统(和处理器)特定的。并取ASLR & VDSO考虑到。

看例如bigloo的源代码里面, 文件 runtime/Include/bigloo.h以标记为例。

如果实现你自己的解释器,一个相关的问题是 garbage collector .我建议使用 Boehm's conservative GC ;它可能不是最快或最好的,但它已经足够好(并且对线程友好)。根据经验(例如在 MELT 中),调试 GC 非常耗时。

此外,今天,内存比标签计算重要得多。请注意 CPU cache , ...

如果在 Linux 上,请查看 /proc/self/maps/proc/$$/maps (见 proc(5))

关于c - 我怎么知道指针中有多少空闲位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27712457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com