[英]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.