【问题标题】:Please explain me this C snippet请解释一下这个 C 片段
【发布时间】:2014-04-04 12:13:54
【问题描述】:

我在 gcc 酷刑测试套件中找到了这个小块 C 宝石,或多或少我理解它,除了标有我的 cmets 的行...

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 获得,而不使用任何库?

【问题讨论】:

    标签: c gcc


    【解决方案1】:

    这是什么asm volatile ("" : : : "memory"); ?

    这基本上意味着汇编代码将在您期望它执行的地方执行。编译器被告知不要围绕它重新排序指令。

    来自wiki

    这些屏障阻止编译器重新排序指令,它们 不要阻止 CPU 重新排序。

    您还可以找到有关此语法的详细信息 Volatile ...?

    【讨论】:

    【解决方案2】:

    __asm__ volatile 是一种编写自己的内联 asm 代码的方式,volatile 位表示 gcc 无法删除它。 Check this answer for links & details.
    该函数然后是用 asm 编写的,并且使用(GCC 特定属性)noinline 意味着该代码不会被编译器内联。如果你想知道。

    __builtin_memcpymemcpy 函数的 GCC 内置(显然)版本。但是,有时会使用常规的标准 memcpy 函数,或者反过来(memcpy 可以被 gcc“优化”,并导致 __builtin_memcpy 调用)。
    它的使用是有争议的,并且编写针对特定编译器扩展的代码并不是一个好主意,但鉴于此代码是 gcc 酷刑测试套件的一部分,明确使用 __buitlin*functions 是有意义的,因为在某些情况下,they could well perform worse than the standard functions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      相关资源
      最近更新 更多