Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否存在等同于void*的固定大小? 我正在做一些C++工作,需要我把普通的广泛使用的数据类型,如int转换成它们的固定大小的对位,例如STD::INT32×T。然而,我有一些使用void*的代码,这给我带来了麻烦_C++_Pointers_C++11 - Fatal编程技术网

是否存在等同于void*的固定大小? 我正在做一些C++工作,需要我把普通的广泛使用的数据类型,如int转换成它们的固定大小的对位,例如STD::INT32×T。然而,我有一些使用void*的代码,这给我带来了麻烦

是否存在等同于void*的固定大小? 我正在做一些C++工作,需要我把普通的广泛使用的数据类型,如int转换成它们的固定大小的对位,例如STD::INT32×T。然而,我有一些使用void*的代码,这给我带来了麻烦,c++,pointers,c++11,C++,Pointers,C++11,我知道在给定的系统上,任何给定指针的大小都是相同的——sizeofvoid*==sizeofint*==sizeofshort*==sizeoflong*。但我也知道指针的大小可能因系统而异,特别是32位和64位。为未来读者编辑:有人指出,指针的大小(绝对或相对)没有保证 是否有能够容纳空隙*的固定尺寸类型?我认为std::intptr\u t或std::uintptr\u t是潜在的候选者,但我不确定哪一个是正确的。这主要是由于签名;我不知道为什么会有一个有符号和一个无符号的intptr\t形

我知道在给定的系统上,任何给定指针的大小都是相同的——sizeofvoid*==sizeofint*==sizeofshort*==sizeoflong*。但我也知道指针的大小可能因系统而异,特别是32位和64位。为未来读者编辑:有人指出,指针的大小(绝对或相对)没有保证

是否有能够容纳空隙*的固定尺寸类型?我认为std::intptr\u t或std::uintptr\u t是潜在的候选者,但我不确定哪一个是正确的。这主要是由于签名;我不知道为什么会有一个有符号和一个无符号的intptr\t形式,因为我不认为指针的符号可以控制。本能告诉我,我想使用uintpr\t,因为我不相信指针可以被签名,但是intptr\t在那里有什么用呢


关于我的需求的更多信息:我正在处理一个DLL,如果可能的话,需要保证交叉编译器的功能。对于基于整数的类型,这并不太糟糕;我能够在幕后将它们转换为std::intXX\t类型。但是我的一个DLL函数执行一些原始内存操作,需要返回一个void*。我担心如果我不能正确包装它会给我带来各种各样的麻烦,但我不知道用什么包装它:我无法找到任何关于指针大小或数据范围的保证。我知道内存本身在DLL之外是可以访问的;这不是问题。但是确保空洞*可以从主机EXE到我的DLL,反之亦然,安全是一个更大的问题。

< P>我正在创建一个程序,它存储在爪哇本地指针中C++中的数据结构。 因为我希望我的应用程序是可移植的,所以我使用了一个Java长的64位整数来存储指针,不管我的系统是32位还是64位体系结构


因此,我建议您将指针存储在int64变量中。

如果您只关心内存大小,则intptr\t和uintptr\t都是可能的

如果你关心实际值或者做一些算术运算,无符号的应该更好

但两者都不是固定大小,它们的存储大小取决于实现


我知道在给定的系统上,任何给定指针的大小都是相同的

不一定。有些平台的char*和void*大于int*

是否有能够容纳空隙*的固定尺寸类型

不,因为void*的大小因平台而异。没有大于64位的标准固定大小类型,也不能保证指针不会大于64位

我认为std::intptr\u t或std::uintptr\u t是潜在的候选者,但我不确定哪一个是正确的


它们都被指定为足够大以容纳任何指针值;但不同平台的规模可能有所不同。如果要对转换后的值执行任何运算,请根据算术类型选择有符号或无符号。

intptr\u t和uintptr\u t不是固定大小的类型,因此它们不足以满足所述目的。您特别要求提供一种能够容纳空隙*的固定尺寸类型。这不是100%可能的,因为我们不知道未来的系统会有什么,因为它们的指针大小128位可能会在我们的生命周期内发生

我建议您使用uint64\u t,并添加一个static\u assertsizeofvoid* 是否存在等同于void*的固定大小

但我也知道指针的大小可能因系统而异,特别是32位和64位

总之,上面的问题和陈述意味着您不仅需要运行的流程,还需要跨流程甚至系统的可移植性。您所能做的就是选择一个整数类型,至少与您希望支持的任何系统的最大大小相同。不能保证任何特定的尺寸都能持久,所以你只能选择你认为合理的尺寸。如果64已经足够,请查看是否有定义uint64\t的头

我认为std::intptr\u t或std::uintptr\u t是潜在的候选者,但我不确定哪一个是正确的

它们的大小取决于正在运行的进程,并且不能保证足够大以容纳来自指针大小更大的其他进程/系统的指针值


内存地址从不为负,因此使用无符号类型是有意义的。可以对从一个内存地址到另一个内存地址的偏移量进行签名,这就是为什么有签名类型用于存储这些差异……

可以安全地假设,即使在不同的编译器之间,void*也将兼容同一体系结构

因为您的目标是DLL,所以只能将DLL加载到具有相同architec的进程中
没错,这应该足以保证互操作性。

您所说的固定大小是什么意思?你的意思是它在任何系统上都有相同的大小吗?如果是这样,答案是否定的。但我不明白你为什么需要这样的东西:这不像你可以将指针保存在文件中,或者通过网络发送,就像你可以使用整数一样。我知道在给定的系统上,任何给定指针的大小都是相同的-不一定是真的。注意:你可能做错了,告诉我们为什么你需要一个固定大小的指针会很有帮助。为什么你需要一个固定大小的指针?固定大小整数的常见原因是1保证范围,以便更容易地推断溢出和位篡改,2能够映射到已知的独立于平台的字节数进行序列化等。对于指针来说,两者似乎都没有意义。实际上,你从来没有对受益于1的指针进行过算术运算,序列化指针还有一大堆其他问题使得2变得毫无意义。@computerfreaker,但这意味着你只需要为DLL的每个二进制版本修复它,对吗?也就是说,用sizeofvoid*==4构建的DLL在sizeofvoid*==8的系统上无论如何都不起作用。互操作性可能是明智的。在我的例子中,java没有空洞。问题是C++,它有空洞*。我知道,但是用例是相似的:OP想要把指针存储在一个固定大小的整数中,UIT64 64看起来是更容易的解决方案。用例不同。OP希望实现跨DLL边界的二进制兼容性,而将其转换为整数是一种误导性的尝试,而不是实际目标。但请注意,它们都不是跨平台的固定大小。如果要进行算术运算,则必须使用带符号的。无符号算术不遵守正常的数学规则。我不同意。使用signed,您可以轻松地添加一个小数字,然后溢出,而使用unsigned则可以得到正确的答案。这最终可能仍然有效,但无法保证。如果您接近溢出,那么您在下游做了一些错误的事情。问题是像abs a-b这样的表达式给出了错误的无符号结果,而这样的表达式很可能用于数值。为什么会出现错误?32位机器中4GB内存的一半是负数。无法保证从正极到负极的正确溢出。