现代C编译器的内联函数被称为一次?
发布时间:2020-12-16 05:54:51 所属栏目:百科 来源:网络整理
导读:就像我的头文件是: 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
就像我的头文件是:
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(...) } 完全可以阅读,不用担心影响性能? 解决方法
您应该将函数标记为静态,以便编译器知道它们是该翻译单元的本地.
没有静态编译器不能假设(禁止LTO / WPA)该函数只调用一次,因此不太可能内联它. 演示使用LLVM Try Out页. 也就是说,首先可读性的代码,微优化(和这样的调整是微优化)只能在性能测量之后才会出现. 例: #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); } } 产生静态: ; 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 0" ; <[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.body for.end: ; preds = %for.body,%entry ret i32 0 } declare i32 @printf(i8* nocapture,...) nounwind 没有静态: ; 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 0" ; <[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*,i32 %i,i32 %rem) ; <i32> [#uses=0] ret void } declare i32 @printf(i8* nocapture,...) nounwind define i32 @main(i32 %argc,%entry ret i32 0 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |