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

C 如何在64位应用程序中使用32位指针?,c,pointers,32bit-64bit,C,Pointers,32bit 64bit,我们学校的项目只允许我们将c程序编译成64位应用程序,他们测试我们的程序的速度和内存使用情况。然而,如果我能够使用32位指针,那么我的程序将消耗比64位更少的内存,也可能运行得更快(更快到malloc?) 我想知道我是否可以在64位应用程序中使用32位指针 感谢您的帮助它可能会略微减少内存使用,但不会提高速度,因为您必须将短指针转换为绝对指针,这增加了开销,而且您也失去了大多数类型检查的好处 它看起来像这样: typedef unsigned short ptr; ... // pre-all

我们学校的项目只允许我们将c程序编译成64位应用程序,他们测试我们的程序的速度和内存使用情况。然而,如果我能够使用32位指针,那么我的程序将消耗比64位更少的内存,也可能运行得更快(更快到malloc?)

我想知道我是否可以在64位应用程序中使用32位指针


感谢您的帮助

它可能会略微减少内存使用,但不会提高速度,因为您必须将短指针转换为绝对指针,这增加了开销,而且您也失去了大多数类型检查的好处

它看起来像这样:

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]));
typedef无符号短ptr;
...
//预先分配您需要的所有内存
char*offset=malloc(256);//确保此大小小于最大无符号整数
//这些“指针”是16位短整数,假设sizeof(int)==4
ptr var1=0,var2=4,var3=8;
//如何读写这些“指针”,你可以用宏隐藏它们
*((int*)和offset[var1])=((int)1)使用GCC

-mx32选项将int、long和指针类型设置为32位,并为x86-64体系结构生成代码。(英特尔386和AMD x86-64选件):


那么基准测试:)

你怎么能如此肯定32位指针会明显快于64位指针(如果有的话)?至少它消耗更少的内存。我不确定是否会有更快的跑步速度,你确定这会很重要吗?您是否有大量基于指针的数据结构?还要注意,开销或重复的指针零扩展操作实际上可能会导致性能下降?-mx32选项将int、long和指针类型设置为32位,并为x86-64体系结构生成代码。(英特尔386和AMD x86-64选项):其他目标:-然后基准:)@user120115:这应该是一个答案,而不是评论。然后我就可以向上投票:-)严格地说,这段代码依赖于未定义的行为,尽管在实践中它可能不会在大多数系统上引起对齐问题(?)。对不起,但是。。。啊。这永远都不是一个好主意。。。但是,当提出一个不太明智的建议时,你至少可以最小化UB的潜在用途:使用<代码> STD::AlgNeNdIDSturie存储最严格的类型,使用适当的C++类型和功能,这样可以提高速度。如果您的程序遇到许多数据缓存未命中,如二进制搜索、遍历二叉树、遍历链表等,使用较小的指针可以节省大量时间。较小的指针意味着更好的数据缓存命中率和更好的性能。我做了一个关于二叉树遍历的实验,32位版本的运行速度是64位版本的0.85倍:这差不多就是我们要做的。请注意,您需要一个相当新的gcc版本(4.7或4.6,带有各种补丁)和一个相当新的binutils。为什么不在一开始就指定它呢?无论如何,对于真正的问题(尽管存在任意的教学限制),这仍然是一个比被接受的可怕的黑客更好的答案。@kevin:
-m32
是与
-mx32
完全不同的模式。x32生成的完全64位代码恰好只使用64位地址。(如果这是家庭作业,那么也不允许使用
-mx32
。但是用C手动编写它可能不会优化到只使用地址大小前缀来忽略地址寄存器的高位。)