2011-04-19 93 views

回答

4

據我所知,這看起來像有人打算修改某些MSVC++特定設置。但是,該設置對於intrinsic pragma不是有效的選項。另一方面,_m_prefetchw是3D現在!內在功能。

像所有的編譯器本徵函數,它公開(可能)在

A.與優化更一致的方式由底層硬件到C或C++應用程序支持更快的彙編指令,並
B.更一致與使用內聯彙編的語言相比。

在x86_64/x64/amd64系統上的MSVC上,內聯彙編不受支持,所以必須使用這種內在函數來訪問底層硬件的whizzbang功能。

最後,應該注意的是,_m_prefetchw是一個3D立即!內在和3D現在!僅在AMD硬件上受支持。這可能不是您想要用於新代碼的東西(即您應該使用SSE代替,它適用於英特爾和AMD硬件,並且具有更多啓動功能)。

0

C,它取決於執行是否承認(和定義)它。

如果實現無法識別「內部」預處理令牌,則該雜注將被忽略。
如果實現能夠識別它,則會發生什麼(如果另一個實現定義的方式不同,則另一個實現會發生在另一個實現上)。

因此,請查看您正在討論的實現的文檔(編輯:如果您希望在不同的實現上編譯源代碼,請不要使用它)。

我在我的系統上找不到任何對man gcc中的「#pragma intrinsic」的引用。

+0

那麼,這是有道理的,因爲它不是GCC選項。我的GCC手冊中沒有'__declspec' - 我沒有看到與這個問題有什麼關係。除GCC外,世界上還有很多編譯器。其餘的答案是好的,但。 – 2011-04-19 22:32:49

+0

這些確實是MSVC特定的編譯指示。 – 2011-04-19 22:37:44

+0

C標準(問題標記爲C)明確定義了#pragma WHATEVER發生了什麼。由於OP沒有說明他目前的執行情況,我認爲他想要標準的含義。 – pmg 2011-04-19 22:39:33

1

與所有「#pragma」指令一樣,「#pragma intrinsic」(note拼寫)的含義因編譯器而異。通常,它表示語法上看起來像是對外部函數的調用的特定內容應該用一些內聯代碼替換。在某些情況下,這可能會大大提高性能,特別是如果編譯器可以確定某些或所有參數的常量值(在後一種情況下,編譯器可能能夠計算函數的值並將其替換爲常量) 。

一般而言,將函數作爲內部函數處理將不會造成任何特定的問題。最大的危險在於,如果用戶在一個模塊中定義了一個與編譯器的內部函數名稱相同的函數,並試圖從另一個模塊調用該函數,編譯器可能會將函數調用替換爲其預期的指令序列。爲了防止這種情況發生,有些編譯器默認不啓用內部函數(因爲這樣做會導致上面的與一些符合標準的程序不兼容),但提供了#pragma指令來啓用它們。編譯器也可以使用命令行選項來啓用內在函數(因爲標準允許有任何內容),或者可以將一些函數(如__memcpy())定義爲內部函數,並在string.h中使用#define指令將memcpy轉換爲__memcpy #include string.h的程序不允許將memcpy用於任何其他目的)。