簡體   English   中英

海灣合作委員會的訂購保證

[英]Ordering guarantee in GCC

我碰巧挖掘C並鎖定自由編程。 擺弄它我想知道gcc能給我一個保證程序執行的方式與我寫下來完全相同的方式,並且在某個步驟中沒有執行寄存器優化且其順序中沒有改變操作。

正如我目前所理解的那樣,它保證了內存操作以完全相同的順序發生,並且方法調用以及它們自身和內存操作以相同的順序發生。 在重新排序之間可能會發生。

可以使用volatile關鍵字關閉寄存器優化。

是否有任何其他保證或角落案件C,尤其是gcc暗示的?

編譯器只需要不改變程序的含義。

程序的含義由其C語句的語義給出,例如, volatile限定符是一種在語義級別上與外部代理進行交互的方法。
然而,單獨的volatile在線程同步方面是無用的,它只有局部效果。

所以你應該只暗示C的標准意味着什么,如果標准沒有對語句賦予語義順序,也沒有任何副作用,那么就沒有了。

為了優化某些代碼,編譯器必須證明優化不會改變含義。
這通常是一個困難(甚至是不可判定的)問題,所以它只在簡單的上下文中完成。

考慮

#include <stdio.h>

int simple(const int a, const int b)
{
    int c = a + b;              //3x Memory operation?
    int d = c*c;                //2x Memory operation?

    return d+d;                 //Memory operation?

}

int main()
{
    int a = 0;                  //Memory operation?
    int b = 0;                  //Memory operation?

    a = simple(2, 3);           //Function call + Memory operation?
    b = simple(3, 4);           //Function call + Memory operation?

    printf("%d %d\n", a, b);    //Function call + 3x Memory operation?

    return 0;
}

C標准規定a = simple(2, 3); b = simple(3, 4);之前執行b = simple(3, 4); 因為表達式的結尾是序列點。

這是gcc生成的完全優化代碼

lea    0x18f0(%rip),%rcx        # 0x100403030, "%d %d\n"
mov    $0x62,%r8d                                  
mov    $0x32,%edx                                  
callq  0x100401110 <printf>  

我使用了cygwin,所以ABI是Windows的。 這相當於

printf("%d %d\n", 50, 98);

這是一個臨時的例子,函數simple純的並且需要編譯時常量表達式 ,因此結果在編譯時是已知的。
這證明了gcc需要優化呼叫


在編寫無鎖代碼時,只要您使用正確的語義(例如,僅為優化而將讀寫訪問作為副作用的volatile ,您就不必擔心編譯器優化。

應該擔心的是內容排序,如我的評論中所指出的那樣。
C11最終在其內存模型中修復了所有這些內容。

如果您的代碼依賴於不重新排序操作而不進行任何其他優化,那么它只是“未定義的行為”。

如果您搜索此類保證,則只需搜索保證您編寫執行正確的損壞程序。 您應該使用由您使用的語言表示的語義。 如果您需要假設語言如何在給定的操作系統和機器上實現操作,那么您完全走錯了路!

如果你實際上對實際的編譯器版本和使用的底層操作系統有某種保證,那么這個功能將無法保證! 所以措辭“保證”也不是真的。 如果必須簡單的答案是:根本沒有保證! 該語言具有語義,編譯器保證實現它。 不多了!

C中線程之間的順序保證只能通過C11中的stdatomic.h或特定於編譯器的擴展來實現。 在所有其他情況下,編譯器需要保證的唯一事情是程序的外部可見行為(這可以大致轉換為:函數調用和不在編譯器控件下的內存引用)與根據標准。 在從C標准的角度來看C11線程不存在之前,所以它並不關心線程行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM