如何在64位应用程序中使用32位指针?

9
我们学校的项目只允许我们将C程序编译为64位应用程序,并测试我们的程序的速度和内存使用情况。然而,如果我能够使用32位指针,那么我的程序将比64位消耗更少的内存,也可能运行得更快(malloc更快吗?)
我想知道是否可以在64位应用程序中使用32位指针?
谢谢帮助!

你怎么能确定32位指针比64位指针更快(如果有的话)? - Mysticial
1
至少它消耗的内存较少。我不确定运行速度是否更快。 - kevin
你确定这会有显著的影响吗?你有大量基于指针的数据结构吗?还要注意,开销或重复的指针零扩展操作实际上可能会导致性能下降。 - Mysticial
9
使用GCC?-mx32选项将int、long和指针类型设置为32位,并为x86-64架构生成代码。(英特尔386和AMD x86-64选项):http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html 其他目标:http://gcc.gnu.org/onlinedocs/gcc/Submodel-Options.html#Submodel-Options - 接着进行基准测试 :) - Morpfh
1
@user120115:这应该是一个答案,而不是评论。那样我就可以点赞了 :-) - Nathan Fellman
显示剩余2条评论
2个回答

39

使用GCC?

-mx32选项将整型、长整型和指针类型设置为32位,并为x86-64架构生成代码。(英特尔386和AMD x86-64选项):

然后进行基准测试 :)


这基本上就是正确的方法。请注意,您需要一个相当新的gcc版本(4.7或带有各种补丁的4.6)和一个相当新的binutils。 - torek
为什么不一开始就明确说明呢?无论如何,这仍然是对“真正”的问题(任意教学限制不考虑)比被接受的可怕黑客更好的答案。 - underscore_d
3
@kevin:-m32-mx32是完全不同的模式。x32生成完全使用64位地址的64位代码。(如果这是作业,那么-mx32也是不允许的。但在C语言中手动编写代码可能无法优化到只使用地址大小前缀来忽略地址寄存器的高位。) - Peter Cordes
有没有类似的 LLVM 工具呢? - rogerdpack

1

你可以“自己动手做”。以下方法可能会稍微降低内存使用,但是它可能无法提高速度,因为您必须将短指针转换为绝对指针,并且这样会增加开销,此外,您将失去大部分类型检查的优势。

它看起来像这样:

typedef unsigned short ptr;
...

// pre-allocate all memory you'd ever need
char* offset = malloc(256); // make sure this size is less than max unsigned int

// these "pointers" are 16-bit short integer, assuming sizeof(int) == 4
ptr var1 = 0, var2 = 4, var3 = 8;

// how to read and write to those "pointer", you can hide these with macros
*((int*) &offset[var1]) = ((int) 1) << 16;
printf("%i", *((int*) &offset[var1]));

通过一些技巧,你可以发明自己的brk()来帮助从偏移量分配内存。

这值得吗?在我看来不值得。


2
严格来说,这段代码依赖于未定义的行为,但实际上在大多数系统上它可能不会导致对齐问题。 - Lundin
它将提高速度。如果您的程序遇到许多数据缓存未命中,例如二进制搜索、遍历二叉树、遍历链表等,使用较小的指针可以转化为显著的时间节省。较小的指针意味着更好的数据缓存命中率和更好的性能。 我进行了一次二叉树遍历实验,32位版本运行时间为64位版本的0.85倍:https://johnysswlab.com/the-price-of-dynamic-memory-memory-access/ - Bogi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接