这是一段看似非常特殊的C++代码.出于某种奇怪的原因,奇迹般地对数据进行排序使得代码几乎快了六倍.
#include <algorithm>
#include <ctime>
#include <iostream>
int main()
{
// Generate data
const unsigned arraySize = 32768;
int data[arraySize];
for (unsigned c = 0; c < arraySize; ++c)
data[c] = std::rand() % 256;
// !!! With this, the next loop runs faster.
std::sort(data, data + arraySize);
// Test
clock_t start = clock();
long long sum = 0;
for (unsigned i = 0; i < 100000; ++i)
{
// Primary loop
for (unsigned c = 0; c < arraySize; ++c) …Run Code Online (Sandbox Code Playgroud) 我理解"内联"本身就是对编译器的建议,并且在它的结构中它可能会或可能不会内联函数,它也会产生可链接的目标代码.
我认为"静态内联"执行相同的操作(可能内联也可能不内联),但在内联时不会产生可链接的目标代码(因为没有其他模块可以链接到它).
"extern inline"在哪里适合图片?
假设我想用内联函数替换预处理器宏,并要求此函数被内联(例如,因为它使用__FILE__和__LINE__宏,这些宏应该为调用者而不是这个调用函数解析).也就是说,如果函数没有内联,我想看到编译器或链接器错误."extern inline"这样做吗?(我假设,如果没有,除了坚持使用宏之外,没有办法实现这种行为.)
C++和C之间是否存在差异?
不同编译器供应商和版本之间是否存在差异?
是否__attribute__((always_inline))强制函数由gcc内联?
在清洁代码(以及我遇到过的其他几本书)中,建议保持功能较小并在它们变大时将其分解.它还表明功能应该只做一件事而且只做一件事.
在C++中优化软件时, Agner Fog声称他不喜欢分解函数的规则只是因为它超过了许多行的某个阈值.他声称这会导致不必要的跳跃,从而降低性能.
首先,我理解,如果我正在处理的代码不是紧密循环并且函数很重,那么调用它们所花费的时间与函数中的代码所用的时间相比是相形见绌的.执行.但是我们假设我正在处理大多数时候由其他对象/函数使用的函数,并且执行相对简单的任务.这些函数遵循第一段中列出的建议(即,执行单个函数并且很小/可理解).然后我开始编写一个性能关键函数,它在紧密循环中利用这些其他函数,本质上是一个框架函数.最后,假设内嵌它们对性能关键功能有好处,但对任何其他功能都没有任何好处(是的,我已经对此进行了描述,尽管有很多我想避免的复制和粘贴).
马上就可以说标记函数inline并让编译器选择.但是如果我不希望所有这些函数都在` .inl文件中或暴露在标题中呢?在我目前的情况下,性能关键函数和它使用的其他函数都在同一个源文件中.
总而言之,我可以有选择地(强制)内联单个函数的函数,以便结束代码表现得像是一个大函数,而不是几个对其他函数的调用.
这部分gcc手册非常模糊,我无法理解重复尝试后forceinline属性的用法.
我正在定义一个对象和某些函数来操纵该对象.这些函数中很少有可以使用原子指令,我希望编译器内联这些函数.但是,我不想在头文件中编写这些函数,并在Linux内核中使用"静态内联"声明它们.
有没有办法强制gcc从另一个翻译单元内联函数?
GCC 具有函数属性 always_inline、noinline 和 flatten,可让您在定义函数时控制内联行为。我想知道是否有一种方法可以在调用函数时自定义内联行为,而不是像属性通常那样为其设置全局内联行为。
对于 noinline,我可以使用 noinline 属性将调用包装在 lambda 中,并立即调用 lambda。对于展平,我可以将函数包装在模板函数中,该模板函数具有调用底层函数的真/假特化,一个具有展平,一个没有。
但对于always_inline我没有这样的技巧。有吗?需要明确的是,我希望能够说应该内联特定的f()调用,而不是使其始终在任何地方内联。
c++ ×4
inline ×4
gcc ×3
c ×2
optimization ×2
coding-style ×1
compilation ×1
extern ×1
g++ ×1
java ×1
performance ×1