gpt4 book ai didi

c - 请向我解释这个 C 片段

转载 作者:行者123 更新时间:2023-12-02 06:34:54 26 4
gpt4 key购买 nike

我在 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 无法删除它。 Check this answer for links & details .
然后函数是用 asm 编写的,并且使用(GCC 特定属性)noinline 意味着此代码不会被编译器内联。如果您想知道。

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

关于c - 请向我解释这个 C 片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22146907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com