C ++中的__builtin__函数是什么?

syk*_*yko 4 c++ compilation

我正在调试性能敏感的事务处理系统。

我找到了一个使用__builtin_memcpy和__builtin_memset而不是memcpy和memset的代码。

__builtin_functions有什么用?,以防止对体系结构或编译器的依赖性问题?

或者..是否有任何性能上的原因偏爱__builtin_functions?

谢谢你:D

Mat*_*son 5

传统的库函数,标准memcpy只是对函数的调用。不幸的是,memcpy通常会为每个小副本都调用,并且调用函数,重新整理几个字节并返回的开销相当大(特别是因为memcpy在函数的开头添加了额外的内容来处理未对齐的内存,循环等,以便在大型副本上表现出色)。

因此,为了使编译器优化它们,它需要例如“知道”如何做memcpy-解决方案是在编译器中包含一个“内置”函数,然后该函数包含如下代码:

 int generate_builtin_memcpy(expr arg1, expr arg2, expr size)
 {
     if (is_constant(size) && eval(size) < SOME_NUMBER)
     {
        ... do magic inline memory copy ... 
     }
     else
     {
         ... call "real" memcpy ... 
     }
 }
Run Code Online (Sandbox Code Playgroud)

[对于可重定目标的编译器,每个CPU体系结构通常都具有这些功能之一,它们memcpy在调用“真实”条件或使用内联memcpy时具有不同的配置。

这里的关键是您可能实际上编写了自己的memcpy函数,该函数不是基于__builtin_memcpy()ISN的,它始终是一个函数,并且不会执行与普通函数相同的操作memcpy[如果更改它的行为,将会有些麻烦很多情况下,由于C标准库可能调用memcpy了几千个位置-但例如,统计memcpy调用的次数以及副本的大小可能是这种用例之一。

使用的另一个重要原因__builtin_*是它们提供的代码否则必须用内联汇编器编写,或者可能根本不为程序员使用。设置/获取特殊寄存器就是这样。

还有其他技术可以解决此问题,例如,clang有一个LibraryPass假设库调用与其他替代方法具有相同的功能,例如,由于printf比“重”得多puts,它将适当printf("constant string with no formatting\n")的替换为puts("constant string with no formatting"),并且解决了许多三角函数和其他数学函数用常量等调用时,转换为常见的简单值

调用__builtin_*直接像功能memcpysin或一些这样的可能是错误的做法-它只是使你的代码的可移植性,而不是在所有一定要快。__builtin_special_function在某些棘手的情况下,通常在没有其他方法的情况下调用该方法-但您应该将其包装在自己的函数中,例如

int get_magic_property()
{
    return __builtin_get_magic_property(); 
}
Run Code Online (Sandbox Code Playgroud)

这样,当您移植到Windows时,您可以轻松地执行以下操作:

int get_magic_property()
{
#if WIN32
    return Win32GetMagicPropertyEx();
#else
    return __builtin_magic_property();
#endif
}
Run Code Online (Sandbox Code Playgroud)