请给我解释一下这个C代码段

请给我解释一下这个C代码段,c,gcc,C,Gcc,我在gcc酷刑测试套件中找到了这个小小的C gem,我或多或少理解它,除了标有我的注释的行 void __attribute__((noinline,noclone)) foo(int *p, float *q) { __asm__ volatile ("" : : : "memory"); } /// ??? 1 int main() { if (sizeof (int) == sizeof (float)) { int i; float f;

我在gcc酷刑测试套件中找到了这个小小的C gem,我或多或少理解它,除了标有我的注释的行

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:

这是什么?直到现在才看到这个语法

问题2:

既然
\uu内置\u memcpy
在我看来是一个函数,那么这是在哪里定义的呢?完整的源代码按原样编译和运行(没有任何额外的包含项和库),所以我很困惑。。。是否有一组通过gcc提供的内置***函数,而不使用任何库

这是什么asm易失性(“:”内存”)

这意味着汇编代码将在您希望它执行的地方执行。编译器被告知不要对其周围的指令重新排序

从:

他们说,这些障碍阻止编译器重新排列指令 不要阻止CPU重新排序


您还可以找到有关此语法的详细信息,volatile是一种编写自己的内联asm代码的方法,
volatile
位表示gcc无法删除它
然后,函数是用asm编写的,使用(GCC特定属性)
noinline
意味着编译器不会内联此代码。万一你想知道

\uuuu内置memcpy
memcpy
函数的GCC内置(显然)版本。但是,有时会使用常规的标准
memcpy
函数,或者反过来使用(
memcpy
可以由gcc“优化”,并导致
\uuuu内置memcpy
调用)。

这种方法的使用是有争议的,编写针对特定编译器扩展的代码并不是一个好主意,但鉴于此代码是gcc测试套件的一部分,明确使用
\uuuu buitlin*
函数是有意义的,在某些情况下,

对于该语法问题,基本上它是C:中的内联汇编程序,这个有你说的影响