例如,说我的头文件是:
class A
{
void Complicated();
}
和我的源文件
void A::Complicated()
{
...really long function...
}
我可以将源文件拆分为
void DoInitialStuff(pass necessary vars by ref or value)
{
...
}
void HandleCaseA(pass necessary vars by ref or value)
{
...
}
void HandleCaseB(pass necessary vars by ref or value)
{
...
}
void FinishUp(pass necessary vars by ref or value)
{
...
}
void A::Complicated()
{
...
DoInitialStuff(...);
switch ...
HandleCaseA(...)
HandleCaseB(...)
...
FinishUp(...)
}
是否完全出于可读性考虑,而又不担心会对性能产生影响?
您应该标记函数,static
以便编译器知道它们在该翻译单元中是本地的。
没有static
编译器就不能假设(除非LTO / WPA)该函数仅被调用一次,因此不太可能内联它。
使用“ LLVM试用”页面进行演示。
就是说,首先要针对可读性的代码进行微优化(这种调整就是微优化),然后再执行性能指标。
例:
#include <cstdio>
static void foo(int i) {
int m = i % 3;
printf("%d %d", i, m);
}
int main(int argc, char* argv[]) {
for (int i = 0; i != argc; ++i) {
foo(i);
}
}
与产生static:
; ModuleID = '/tmp/webcompile/_27689_0.bc'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
@.str = private constant [6 x i8] c"%d %d\00" ; <[6 x i8]*> [#uses=1]
define i32 @main(i32 %argc, i8** nocapture %argv) nounwind {
entry:
%cmp4 = icmp eq i32 %argc, 0 ; <i1> [#uses=1]
br i1 %cmp4, label %for.end, label %for.body
for.body: ; preds = %for.body, %entry
%0 = phi i32 [ %inc, %for.body ], [ 0, %entry ] ; <i32> [#uses=3]
%rem.i = srem i32 %0, 3 ; <i32> [#uses=1]
%call.i = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x i8]* @.str, i64 0, i64 0), i32 %0, i32 %rem.i) nounwind ; <i32> [#uses=0]
%inc = add nsw i32 %0, 1 ; <i32> [#uses=2]
%exitcond = icmp eq i32 %inc, %argc ; <i1> [#uses=1]
br i1 %exitcond, label %for.end, label %for.body
for.end: ; preds = %for.body, %entry
ret i32 0
}
declare i32 @printf(i8* nocapture, ...) nounwind
没有static:
; ModuleID = '/tmp/webcompile/_27859_0.bc'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
@.str = private constant [6 x i8] c"%d %d\00" ; <[6 x i8]*> [#uses=1]
define void @foo(int)(i32 %i) nounwind {
entry:
%rem = srem i32 %i, 3 ; <i32> [#uses=1]
%call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x i8]* @.str, i64 0, i64 0), i32 %i, i32 %rem) ; <i32> [#uses=0]
ret void
}
declare i32 @printf(i8* nocapture, ...) nounwind
define i32 @main(i32 %argc, i8** nocapture %argv) nounwind {
entry:
%cmp4 = icmp eq i32 %argc, 0 ; <i1> [#uses=1]
br i1 %cmp4, label %for.end, label %for.body
for.body: ; preds = %for.body, %entry
%0 = phi i32 [ %inc, %for.body ], [ 0, %entry ] ; <i32> [#uses=3]
%rem.i = srem i32 %0, 3 ; <i32> [#uses=1]
%call.i = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x i8]* @.str, i64 0, i64 0), i32 %0, i32 %rem.i) nounwind ; <i32> [#uses=0]
%inc = add nsw i32 %0, 1 ; <i32> [#uses=2]
%exitcond = icmp eq i32 %inc, %argc ; <i1> [#uses=1]
br i1 %exitcond, label %for.end, label %for.body
for.end: ; preds = %for.body, %entry
ret i32 0
}
问题内容: 我发现C ++编译器是这样做的,但是我想知道Java编译器是否这样做,因为他们在回答中说添加静态会这样做,但是在Java和C ++中,静态是不同的。在我的情况下,性能很重要,因为使用的功能是在游戏循环中每帧仅调用一次,而在其他地方则不调用,以使其更具可读性。 在我的代码中,我将其设置与此类似,但要进行多次调用 然后update(),render()将调用更多调用其他方法的方法 编译器是
我有一个函数定义为 (是映射到英特尔MIC体系结构上SIMD寄存器的本机数据类型) 由于这个函数相当短并且经常被调用,我希望它在每次调用时都内联。但是英特尔的编译器似乎不愿意内联这个函数,即使在我使用 - 和 选项之后也是如此。它报告说“Forceinline不被授予呼叫......”编译时。由于我必须使用一些编译器特定的功能,例如类型,英特尔编译器是我唯一的选择。 更多信息: 文件结构非常简单。
本文向大家介绍在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?相关面试题,主要包含被问及在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?时的应答技巧和注意事项,需要的朋友参考一下 C++ 语言支持函数重载,C 语言不支持函数重载。函数被C++ 编译后在库中的名字与 C 语言的不同。假设某个函数的原型为:void foo(int x, in
问题内容: 我有一个函数,每2.5秒调用一次以检查在后台运行的任务。如果响应为错误,则它将axios调用到url,如果响应成功,则停止该函数。 这在Chrome和Mozilla上完美运行,但由于某些原因在IE(版本11)中不起作用。该函数可以无限地调用自身,但是检查日志表明它仅调用axios一次,即使后端任务已经完成,它也将永远循环。 为什么没有在IE上再次调用axios?有什么我想念的吗? 问题
问题内容: 在以下示例中,当单击时,将显示而不是。为什么?您将如何解决? 问题答案: React的对帐算法假定没有相反的信息,如果自定义组件出现在后续渲染的同一位置,则它与以前的组件相同,因此将重用前一个实例,而不是创建一个新实例。 如果要实现,则会看到被调用。 不同的节点类型 元素不太可能生成看起来像a 会生成的DOM 。无需花费时间尝试匹配这两种结构,React只是从头开始重建树。 作为推论,
我正在尝试通过与分支内联的am调用c中的外部函数。我正在编译为arm m0指令集,但它返回错误表达式。 代码是: 回报是: 我们需要做什么?