gpt4 book ai didi

C#:是否有任何标准编译标志允许我检测我是为 x86 还是 x64 编译?

转载 作者:行者123 更新时间:2023-11-30 21:18:49 24 4
gpt4 key购买 nike

我在计数器上使用原子操作,我关心性能。我知道在 64 位平台上递增一个 long 可以一次性完成,而在 32 位平台上需要两条指令

我有这样一段代码

#if X64
using COUNTER_TYPE = System.Int64;
#else
using COUNTER_TYPE = System.Int32;
#endif

但我在我的项目配置中没有定义 X64 常量。我想知道是否有一种方法可以通过 #if 语句确定我们是否正在为 x64 编译。当我实现循环队列时,我想在 x86 上运行时将其大小强制为 40 亿个元素,但我可能会喜欢在 x64 上将其大小解锁为 long.MaxValue。我知道在现代处理器上,一两条指令并不真正在意,但我仍然很想知道我是否可以通过代码检测配置,而无需重新定义指定了此类常量的 x64 配置文件。

谢谢。

最佳答案

一种方法是使用 System.IntPtr,它已经抽象了程序集的“位数”。

请注意,默认情况下,C# 编译器针对“anycpu”进行编译,这意味着程序集在运行时的位数由加载它的进程的位数决定。对于可执行程序集,对于 32 位操作系统是 x86,对于 64 位操作系统是 x64。

获取 IntPtr 大小的等价方法有 3 种:

// Use the static property
var size = IntPtr.Size;

// Use Marshal
var size = System.Runtime.InteropServices.Marshal.SizeOf(typeof(IntPtr));

// Use unsafe with sizeof
unsafe
{
var size = sizeof(IntPtr);
}

我看不出有什么理由不在所有情况下都使用静态属性,因为它最简单。

关于C#:是否有任何标准编译标志允许我检测我是为 x86 还是 x64 编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4054058/

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