Semerkin Asked:2020-05-25 23:50:49 +0800 CST2020-05-25 23:50:49 +0800 CST 2020-05-25 23:50:49 +0800 CST g++/gcc 编译器优化选项 772 在讨论优化的背景下展开循环意味着什么(如果可能以工农方式) 在某些选项中,没有嵌入函数......但是没有嵌入怎么办?(在嵌入下,我了解可执行文件中存在功能代码) 我可以编译具有不同优化的单个模块,然后将它们单击到可执行文件中吗? оптимизация 2 个回答 Voted Best Answer insolor 2020-05-26T00:17:17+08:002020-05-26T00:17:17+08:00 循环展开是将循环代码转换为非循环代码。例如,这段代码: for(i=0; i<5; i++) func(i); 展开于 func(0); func(1); func(2); func(3); func(4); 当在编译时知道循环迭代的次数时,循环展开就起作用了。会增加本机代码的大小,但可能会提高性能。由于没有跳转,性能可以提高(简单地说,处理器更容易执行线性代码,加上编译器可以通过特殊方式对指令进行分组/重新排列来进一步优化线性代码)。 嵌入(“内联”),如果完全简化的话,就是用函数体代替(而不是)它的调用。如果从多个位置调用该函数,这将增加本机代码的大小,但可能会提高性能,例如,如果在循环内调用该函数。根据优化级别,编译器可能会内联未标记为inline. 或者不要使用该关键字内联函数。 你可以。正如您在问题中所写的那样 - 分别编译每个模块,然后将生成的目标文件链接到可执行文件中。我看不出有多少实际用途。 在选择优化参数之前,是否应该首先评估代码的循环和内联函数? 优化可以使事情变得更好,也可以破坏事情,特别是如果您的代码中有部分行为未定义。此外,在高度优化时,可能会使用特定于您的处理器的机器指令,因此,可执行文件可能无法在某些计算机上运行。因此 - 尝试在不同的优化级别进行编译,并在不同的计算机上进行测试。专门为某些编译器的功能锐化您的代码,或者为了进行某种优化,恕我直言,是不值得的。最好做高级优化(算法优化),低级编译器会为你做。 Fat-Zer 2020-05-26T00:27:13+08:002020-05-26T00:27:13+08:00 在讨论优化的背景下(如果可能,以工农方式)展开循环意味着什么。 假设有三个向量和一个循环: int a[3], b[3] , c[3]; // ... for (int i =0; i<3; ++i) { c[i] = a[i] +b[i]; } 循环展开意味着编译器可以用汇编代码替换这个循环,类似于从以下生成的代码: c[0] = a[0] + b[0]; c[1] = a[1] + b[1]; c[2] = a[2] + b[2]; 在某些选项中,没有嵌入函数......但是没有嵌入怎么办?(在嵌入下,我了解可执行文件中存在功能代码) 错了,函数内联是关键字暗示的inline。那些。什么时候: inline int add (int a, int b) { return a+b;} int main (void) { int aMain,bMain; // ... int c = add (aMain, bMain); } 身体可以在它调用的地方被替换。那些。实际上,代码可能类似于以下内容: int main (void) { int aMain,bMain; // ... int c = aMain + bMain; } 重要的一点:内联的决定总是由编译器做出的,内联只是“建议”它并调整它的启发式。 我可以编译具有不同优化的单个模块,然后将它们单击到可执行文件中吗? 一般来说 - 是的,至少对于这个标志不-O[123s]应该产生问题。但是恕我直言,您可以选择一些会导致冲突或错误的标志组合(例如,各种标志-fabi-version=*)。
循环展开是将循环代码转换为非循环代码。例如,这段代码:
展开于
当在编译时知道循环迭代的次数时,循环展开就起作用了。会增加本机代码的大小,但可能会提高性能。由于没有跳转,性能可以提高(简单地说,处理器更容易执行线性代码,加上编译器可以通过特殊方式对指令进行分组/重新排列来进一步优化线性代码)。
嵌入(“内联”),如果完全简化的话,就是用函数体代替(而不是)它的调用。如果从多个位置调用该函数,这将增加本机代码的大小,但可能会提高性能,例如,如果在循环内调用该函数。根据优化级别,编译器可能会内联未标记为
inline
. 或者不要使用该关键字内联函数。你可以。正如您在问题中所写的那样 - 分别编译每个模块,然后将生成的目标文件链接到可执行文件中。我看不出有多少实际用途。
优化可以使事情变得更好,也可以破坏事情,特别是如果您的代码中有部分行为未定义。此外,在高度优化时,可能会使用特定于您的处理器的机器指令,因此,可执行文件可能无法在某些计算机上运行。因此 - 尝试在不同的优化级别进行编译,并在不同的计算机上进行测试。专门为某些编译器的功能锐化您的代码,或者为了进行某种优化,恕我直言,是不值得的。最好做高级优化(算法优化),低级编译器会为你做。
假设有三个向量和一个循环:
循环展开意味着编译器可以用汇编代码替换这个循环,类似于从以下生成的代码:
错了,函数内联是关键字暗示的
inline
。那些。什么时候:身体可以在它调用的地方被替换。那些。实际上,代码可能类似于以下内容:
重要的一点:内联的决定总是由编译器做出的,内联只是“建议”它并调整它的启发式。
一般来说 - 是的,至少对于这个标志不
-O[123s]
应该产生问题。但是恕我直言,您可以选择一些会导致冲突或错误的标志组合(例如,各种标志-fabi-version=*
)。