[英]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
函數, memcpy
( memcpy
可以通過gcc “優化” ,並導致__builtin_memcpy
調用)。
使用它是有爭議的,編寫針對特定編譯器擴展的代碼並不是一個好主意,但鑒於此代碼是gcc酷刑測試套件的一部分,明確使用__buitlin*
函數是有意義的,如在某些情況下, 它們的表現可能比標准功能差
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.