簡體   English   中英

請解釋我這個C片段

[英]Please explain me this C snippet

我在gcc酷刑測試套件中找到了這個小小的C寶石,我或多或少都明白了,除了標有我評論的行...

void __attribute__((noinline,noclone))
foo(int *p, float *q) { __asm__ volatile ("" : : : "memory"); } /// ??? 1

int main()
{
  if (sizeof (int) == sizeof (float))
    {
      int i;
      float f;
      int *p;
      /* Prevent i and f from being rewritten into SSA form. */
      foo (&i, &f);
      i = 0;
      f = 1.0;
      p = (int *)&f;
      __builtin_memcpy (&i, p, 4);     /// ??? 2
      if (*(float *)&i != 1.0)
        __builtin_abort ();
    }
  return 0;
}

那么,問題1:

這是什么__asm__ volatile ("" : : : "memory"); 到目前為止還沒有看到這種語法......

問題2:

既然__builtin_memcpy覺得我是一個函數,這個定義是什么? 完整的源代碼編譯並按原樣運行(沒有任何額外的包含和庫)所以我很茫然......有沒有一組__builtin***函數可以通過gcc獲得,而不使用任何庫?

__asm__ volatile是一種編寫自己的內聯asm代碼的方法,而volatile位意味着gcc無法刪除它。 查看此答案以獲取鏈接和詳細信息
該函數然后用asm編寫,並且使用(GCC特定屬性) noinline意味着編譯器不會內聯此代碼。 如果你想知道。

__builtin_memcpy是一個GCC內置(顯然)版本的memcpy函數。 但是,有時會使用常規的標准memcpy函數, memcpymemcpy可以通過gcc “優化” ,並導致__builtin_memcpy調用)。
使用它是有爭議的,編寫針對特定編譯器擴展的代碼並不是一個好主意,但鑒於此代碼是gcc酷刑測試套件的一部分,明確使用__buitlin*函數是有意義的,如在某些情況下, 它們的表現可能比標准功能差

什么是asm volatile(“” ::: “memory”);

這通常意味着匯編代碼將在您希望執行的位置執行。 編譯器被告知不要重新排序它周圍的指令。

來自維基

這些障礙阻止編譯器重新排序指令,它們不會阻止CPU重新排序。

您也可以找到有關此語法的詳細信息

暫無
暫無

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

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