gpt4 book ai didi

c++ - 在 x86_32/64 中的指针和整数之间进行转换

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:38 26 4
gpt4 key购买 nike

我有一个简单的虚拟机,是我为了好玩而制作的。它在非常低的级别上工作,并且没有任何类型的概念。一切都只是一个整数。有一些获取指针和通过指针访问内存的指令。问题在于这些指针只是简单地存储为 uint64_t,而任何指针算法都是整数算法。机器在将其用作指针时将其转换为 void*。嗯,这种代码在汇编级别很明显,但 C 和 C++ 标准不允许程序员安全地进行整数指针转换,尤其是当整数用于更改指针的值时。

我不会让这个玩具 VM 随处携带。它只是期望在 x86_32/64 机器下工作,而且即使在完全编译器优化之后它似乎也能很好地工作。我认为这是因为指针在 x86 体系结构中表示为整数没有什么不同。

在这种情况下通常采用什么样的解决方案,语言标准没有声明某些代码是安全的,但它在目标硬件中确实应该是安全的,而且结果看起来还不错?

或者作为一个更实际的问题,我怎样才能让编译器 (gcc) 不对像这样的代码执行破坏性优化

uint64_t registers[0x100];
registers[0] = (uint64_t)malloc(8);
registers[0] += 4;
registers[2] = 0;
memcpy(&registers[2], (void*)registers[0], 4);

上面不是真正的代码,但是特定的字节码指令序列实际上会做与上面类似的事情。

最佳答案

如果您真的需要将指针转换为整数,请至少使用uintptr_t,看在面条怪物的份上!此类型(连同其已签名的对应类型)意味着可以安全地转换为指针或从指针转换。但是,它不能用于操作(但对于不修改两个值的表示的线性模型可能是安全的)。

那么,你的代码似乎没有意义,反而可能会阻碍编译器主动优化。如果不更深入地了解您打算完成什么,我会说,很可能有更好的方法。

关于c++ - 在 x86_32/64 中的指针和整数之间进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31182227/

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