2010-10-29 52 views
2

我在櫃檯上使用原子操作,我關心性能。我知道,64位平臺遞增long可以一次性完成,對代替它需要在32位平臺上的兩個指令C#:是否有任何標準的編譯標誌,允許我檢測是否編譯爲x86或x64?

我有這樣的代碼片段

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

但我沒有定義X64在我的項目配置中不變。我想知道是否有一種方法可以通過#if語句來確定是否編譯x64。當我實現一個循環隊列時,我想在x86上運行它的大小高達40億個元素,但是我可能會感激在x64上將其大小解鎖爲long.MaxValue。我知道,在現代處理器上,一條或兩條指令並不真正關心,但我仍然很想知道是否可以通過代碼檢測配置,而無需使用指定的常量重新定義x64配置文件。

謝謝。

+2

這需要首先進行健全性檢查。嘗試在x86上實際填充40億個項目的循環隊列。現在在x64上再次嘗試。 – 2010-10-29 18:08:51

回答

2

這樣做的一種方法是使用System.IntPtr,它已經提取了程序集的「位」。

請注意,默認情況下,C#編譯器針對「anycpu」進行編譯,這意味着程序集在運行時的位數由其加載的進程的位數決定。對於可執行程序集,這是用於32位操作系統的x86和用於64位操作系統的x64。

有3分等價的方法來獲得的IntPtr大小:

// 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); 
} 

我看不出有任何理由不使用靜態屬性適用於所有情況,因爲它是最容易。

+0

這是通過獲取sizeof(System.IntPtr)完成的? – Jordan 2013-10-15 18:54:24

+1

'System.IntPtr.Size' – codekaizen 2013-10-15 20:00:46

+1

如果你想要做的只是在運行時(不是在編譯時)決定,如果這是64位的,使用'Environment.Is64BitProcess'靜態屬性。 (在.NET 4.0中(自2010年起)。) – 2013-10-15 21:53:33

2

不,沒有這樣的預處理器標誌可用,部分原因是C#沒有真正的編譯不同平臺的概念。命令行選項/platform不會改變C#代碼編譯的方式,而是在生成的CLR二進制文件上設置一個標誌,以限制二進制文件可以運行的處理器類型。

一般來說,如果您想要根據32位和64位平臺更改4到8個字節之間的數字值的大小,bestn方法是將System.IntPtr類型包裝起來。這種類型將以這種方式變化,並且您的類型可以有效地將其用作後備存儲。

相關問題