å·²ç»é—®è¿‡that问题了。ç”案是“局部å˜é‡çš„å †æ ˆç©ºé—´é€šå¸¸åœ¨å‡½æ•°èŒƒå›´å†…åˆ†é…â€ã€‚å› æ¤ï¼Œåœ¨å¾ªçŽ¯å¤–部/内部声明å˜é‡çš„开销没有差别。
现在,å‡è®¾æˆ‘们在循环内部有一个带有函数的代ç 片段:
void do_sth(int &i) {int var=i+1;}
int i = 0;
while(i < 100)
{
do_sth(i);
i++;
}
第二个片段,其外部声明了å˜é‡ï¼š
int i = 0;
int var;
while(i < 100)
{
var = i+1;
i++;
}
我的问题是 - 在实际场景(使用现代编译器)ä¸ç¬¬ä¸€ä¸ªç‰‡æ®µçš„开销是多少?如果确实å˜åœ¨å¼€é”€ï¼Œé‚£ä¹ˆå®ƒæœ‰å¤šå¤§ï¼Ÿå®ƒæ˜¯å¦ä¸Žåœ¨å¾ªçŽ¯çš„æ¯ä¸ªæ¥éª¤ä¸å¯¹æ•´æ•°è¿›è¡Œé¢å¤–çš„åŠ æ³•ï¼ˆè¿ç®—符+)相比较?
ç”案 0 :(得分:2)
å¯ç”¨äº†ä¼˜åŒ–的现代编译器很å¯èƒ½å†…è”函数调用,åªè¦å®ƒç¬¦åˆå†…è”需求(没有外部链接ç‰ï¼‰ï¼Œå› æ¤è¿™ä¸¤ä¸ªç‰ˆæœ¬å°†ç”Ÿæˆç›¸åŒçš„代ç 。
如果函数没有内è”,则确实å˜åœ¨å¼€é”€ï¼šå‡½æ•°è°ƒç”¨å’Œå‡½æ•°è¿”回,å‚æ•°åœ¨å †æ ˆä¸ä¼ 递。这ä¸è¿‡æ˜¯ä¸€ä¸ªç®€å•çš„补充。
ç”案 1 :(得分:1)
找出ç”案的最佳方法是查看调试器ä¸çš„å汇编代ç 。 在这ç§æƒ…况下,第一个代ç 具有循环ä¸å‡½æ•°è°ƒç”¨çš„å¼€é”€ã€‚æ ¹æ®ç”¨äºŽå‡½æ•°çš„调用约定,函数调用å¯èƒ½ä¼šå‘生ä¸åŒçš„事情。汇编代ç ä¸çš„通常情况是将å‚数推é€åˆ°å †æ ˆï¼Œè°ƒç”¨å‡½æ•°ï¼Œç„¶åŽå‡½æ•°åˆ›å»ºå †æ ˆå¸§ï¼Œå¼¹å‡ºå †æ ˆä»¥èŽ·å–å‚æ•°ï¼Œå¹¶åœ¨å‡½æ•°è¿”å›žæ—¶å¼¹å‡ºå †æ ˆä»¥èŽ·å–è°ƒç”¨è€…è°ƒç”¨è€…çš„å †æ ˆå¸§ã€‚å¯¹äºŽåŠŸèƒ½ä½“éžå¸¸çŸçš„代ç ,头部å¯ä»¥æ˜¯å®žé™…功能体的10å€å·¦å³ã€‚ (10æ¡æŒ‡ä»¤ä¸Ž1æ¡æŒ‡ä»¤ï¼‰ã€‚ 如果将函数定义为内è”函数,则所有开销都会消失。
ç”案 2 :(得分:0)
如果è¦æ±‚在最基本的级别上优化代ç ,任何åˆç†çš„编译器都会为这两个片段生æˆå®Œå…¨ç›¸åŒçš„指令。
ç”案 3 :(得分:0)
当å‰çš„编译器足够èªæ˜Žï¼Œå¯ä»¥æ£€æŸ¥å˜é‡å’Œå‡½æ•°çš„使用情况,并在编译时和链接时优化代ç ã€‚å› æ¤ï¼Œåœ¨ä¼˜åŒ–之åŽï¼Œä¸¤æ®µä»£ç 之间应该有微ä¸è¶³é“的差异。æ¤LLVM链接时间优化文档应æ供更好的相关信æ¯ã€‚
ç”案 4 :(得分:0)
int i = 0;
int var;
while(i < 100)
{
var = i+1;
i++;
}
int i = 0;
while(i < 100)
{
int var = i+1;
i++;
}
通常会产生完全相åŒçš„代ç 。但是有充分的ç†ç”±ä½¿ç”¨ç¬¬äºŒç§ã€‚
它的æ„图更清晰,代ç å¯ä»¥æ›´å¥½åœ°è¿›è¡Œä¼˜åŒ–ï¼Œå› ä¸ºç¼–è¯‘å™¨çŸ¥é“var仅在循环的æŒç»æ—¶é—´å†…需è¦
ç”案 5 :(得分:0)
我å‡è®¾å…许编译器最好地优化代ç (å¦åˆ™è°ˆè®ºæ€§èƒ½æœ‰ç‚¹æ— æ„义)。
如果在示例ä¸ç¼–译循环时do_sth
的主体是å¯è§çš„,编译器很å¯èƒ½ä¼šå†…è”它,然åŽåˆ 除var
的赋值(并为{{1}分é…å †æ ˆç©ºé—´})作为æ»ä»£ç ï¼Œå› æ¤å¯¹äºŽè¿™ç§æƒ…况,开销实际上并ä¸å˜åœ¨ã€‚å¦‚æžœæ— æ³•å†…è”var
,则函数调用的æˆæœ¬æ¯”int的声明更令人担忧。如果函数å¯ä»¥å†…è”,å³ä½¿do_sth
ä¸æ˜¯æ»ä»£ç ,编译器也有å¯èƒ½å°†ç¬¬ä¸€ä¸ªç‰ˆæœ¬è½¬æ¢ä¸ºç¬¬äºŒä¸ªç‰ˆæœ¬ã€‚æ‰€ä»¥å¯¹äºŽè¿™æ ·çš„ä¾‹åæ¥è¯´çœŸçš„没关系。
å¦‚æžœä½ çš„å˜é‡æ˜¯ä¸€ä¸ªæ›´å¤æ‚的类型(éžPOD classtype),这很é‡è¦ã€‚在这ç§æƒ…况下,第一个版本将为æ¯æ¬¡è¿ä»£è°ƒç”¨æž„é€ å‡½æ•°å’Œæžæž„函数一次,而第二个版本将为æ¯æ¬¡è¿ä»£è°ƒç”¨èµ‹å€¼è¿ç®—符一次,并且åªå¯¹æž„é€ å‡½æ•°å’Œæžæž„函数调用一次。但请注æ„,这并没有说明哪个版本更快(å–决于这些方法的实现)。
ç”案 6 :(得分:0)
您确定已æ£ç¡®è§£å†³äº†é—®é¢˜/ç–‘é—®å—ï¼Ÿæ ¹æ®æ‚¨å‘布的内容 - do_sthå‡½æ•°å°†å…·æœ‰é€šå¸¸çš„å‡½æ•°è°ƒç”¨å¼€é”€ã€‚å¦‚æžœä½ å†…è”它会消除开销。
ç”案 7 :(得分:0)
我想知é“的是 - 整个程åºæ‰§è¡Œæ—¶é—´å 这个循环的百分比是多少?
例如,如果这åªæ˜¯ä¸€ä¸ªæµ‹è¯•ç¨‹åºï¼Œå¹¶ä¸”您æ£åœ¨æ‰§è¡Œè¯¥ä»£ç 1e9次并对其进行计时,而ä¸æ‰§è¡Œä»»ä½•å…¶ä»–æ“作,则将 在函数调用时产生显ç€å·®å¼‚内è”与å¦ã€‚
æ ¹æ®æˆ‘çš„ç»éªŒï¼Œåœ¨ä»»ä½•çœŸå®žçš„程åºä¸ï¼Œè¿™ç§å¾ªçŽ¯å¾ˆå°‘å 用很多时间。 æˆ‘è®¤ä¸ºä½ ä¸éœ€è¦è¢«å‘ŠçŸ¥è¿™ä¸€ç‚¹ï¼Œä½†æ˜¯ä¸€äº›ç¨‹åºå‘˜å¿…é¡»å¦ä¼šä¸€ç§æ¯”例感。 ç†å‘ä¸ä¼šæœ‰åŠ©äºŽå‡è‚¥ã€‚