【发布时间】:2013-12-24 17:25:09
【问题描述】:
我使用 Microsoft Visual Studio 2012 作为我的 IDE 环境。显然,我的机器运行的是 Windows 7 x64,我正在尝试开发一个 64 位的程序。
但请注意,编译器是 Nvidia 的 nvcc(我已验证我下载的是 64 位版本)。
为详细起见,这是 Visual Studio 打印出来的编译命令:
D:..."C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\bin\nvcc.exe" -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include" -G --keep-dir x64\Debug -maxrregcount=0 --machine 64 --compile -g -DWIN64 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd " -o x64\Debug\kernel.cu.obj "...kernel.cu" -clean
它似乎正在编译为 64 位。
如果是这样,这就是我注意到的:
When compiled to run on a Windows platform...
(1) sizeof(int) == 4
(2) sizeof(long) == 4 //Where 1 and 2 are true regardless of platform, x86 or x64
(3) sizeof(long long) == 8
这是准确的吗?如果是,这是否意味着我必须声明一个 long long 才能在 Windows 中使用 8 字节“like”整数? (这意味着我需要避免双打和浮动)。
【问题讨论】:
-
当编译使用 Visual C++ 在 Windows 中运行时。各种类型的大小更多地取决于编译器而不是操作系统。
-
@cHao 真的吗?向我展示一个与 Windows 兼容的编译器,它没有 16 位 short、32 位 int/long 和 64 位 long long。
-
@JonathanLeffler 是的,我看到了那篇文章。但是,我想验证我的编译器设置是否正确。
-
@Sneftel:没见过……但也没看过,反正也没关系。 Windows API(不管位数)几乎从不直接使用基本类型,正是因为对东西的大小做出假设是一个坏主意——尤其是编译器明确允许定义的东西(在指定的限制内)在标准中)。
-
从 API 架构的角度来看,抽象当然是有意义的。不过,从编程的角度来看,只要您不进行嵌入式或奇怪的大型机编程,您就可以放心地假设这些类型宽度。