请解释我这个C片段

Fer*_*eak 2 c gcc

我在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;
}
Run Code Online (Sandbox Code Playgroud)

那么,问题1:

这是什么__asm__ volatile ("" : : : "memory");?到目前为止还没有看到这种语法......

问题2:

既然__builtin_memcpy觉得这是一个功能在哪里定义?完整的源代码按原样编译和运行,(没有任何额外的包含和库)所以我很茫然...有没有一组__builtin***函数可以通过gcc,而不使用任何库?

Eli*_*gem 6

__asm__ volatile是一种编写自己的内联asm代码的方法,该volatile位意味着gcc无法删除它.查看此答案以获取链接和详细信息.
该函数然后用asm编写,并且(GCC特定属性)的使用noinline意味着编译器不会内联此代码.如果你想知道.

__builtin_memcpy是一个GCC内置(显然)版本的memcpy功能.但是,有时memcpy会使用常规的标准函数,反之亦然(memcpy可以通过gcc "优化",并导致__builtin_memcpy调用).
使用它是有争议的,编写针对特定编译器扩展的代码并不是一个好主意,但鉴于此代码是gcc酷刑测试套件的一部分,__buitlin*明确使用这些函数是有意义的,如在某些情况下,它们的表现可能比标准功能差