我在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获得,而不使用任何库?
答案 0 :(得分:6)
__asm__ volatile
是一种编写自己的内联asm代码的方法,而volatile
位意味着gcc无法删除它。 Check this answer for links & details。
该函数然后用asm编写,并且使用(GCC特定属性)noinline
意味着编译器不会内联此代码。万一你想知道。
__builtin_memcpy
是memcpy
函数的GCC内置(显然)版本。但是,有时候会使用常规的标准memcpy
函数,反之亦然(memcpy
可以通过gcc “优化”,并生成{{{ 1}}来电)
使用它是有争议的,编写针对特定编译器扩展的代码并不是一个好主意,但鉴于此代码是gcc酷刑测试套件的一部分,明确使用__builtin_memcpy
函数是有意义的,在某些情况下,they could well perform worse than the standard functions
答案 1 :(得分:3)
这是什么 asm volatile(“”:::“memory”); ?
这通常意味着汇编代码将在您希望执行的位置执行。编译器被告知不要重新排序它周围的指令。
来自wiki:
这些障碍阻止编译器重新排序指令 不要阻止CPU重新排序。
您还可以找到有关此语法的详细信息 Volatile ...?。