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

kev*_*vin 8 c pointers 32bit-64bit

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

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

谢谢您的帮助

Mor*_*pfh 32

使用GCC?

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

然后基准:)

  • @kevin:“-m32”是与“-mx32”完全独立的模式。x32 生成完全 64 位代码,但恰好仅使用 64 位地址。(如果这是家庭作业,那么`-mx32`也不会被允许。但是用C手动编写它可能不会优化为仅使用地址大小前缀来忽略地址寄存器的高位。) (3认同)

Lie*_*yan 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]));
Run Code Online (Sandbox Code Playgroud)

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

这值得么?国际海事组织没有。

  • 严格来说,这段代码依赖于未定义的行为,尽管实际上它可能不会在大多数系统上引起对齐问题(?)。 (2认同)