Denna tråd fortsätter off-topic diskussionen i
http://www.webforum.nu/showthread.php?s=&threadid=75870
Jag menar att man ska vänta med deklareringen om man kan, medan PeW menar att det inte har någon betydelse för hastigeten och bör undvikas.
Här kommer ett mycket enkelt exempel som visar på att olika maskinkod kommer att genereras. I detta fall används en enkel int, vilket gör att vinsten endast blir en enda mov instruktion. Men testar man detta med std::string eller andra mer komplexa datatyper, kommer skillnaden att bli mer markant.
Deklaration på olika ställen
int a=2;
0040103A: C745F802000000 mov dword ptr [ebp-0x8],0x2
if (b)
00401041: 807DFF00 cmp byte ptr [ebp-0x1],0x0
00401045: 7410 je main+0x47 (0x401057)h
{
int c=2;
00401047: C745F402000000 mov dword ptr [ebp-0xc],0x2
//anrop av funktion
f(c);
0040104E: FF75F4 push dword ptr [ebp-0xc]
00401051: E8AAFFFFFF call f(int) (0x401000)5
00401056: 59 pop ecx
}
//Slut på intressant kod
Deklaration på samma ställe
//Start av intressant kod
int a=2,c=2;
00401034: C745F802000000 mov dword ptr [ebp-0x8],0x2
0040103B: C745F402000000 mov dword ptr [ebp-0xc],0x2
if (b)
00401042: 807DFF00 cmp byte ptr [ebp-0x1],0x0
00401046: 7409 je main+0x41 (0x401051)h
{
//anrop av funktion
f(c);
00401048: FF75F4 push dword ptr [ebp-0xc]
0040104B: E8B0FFFFFF call f(int) (0x401000)5
00401050: 59 pop ecx
}
//Slut på intressant kod
Visserligen har PeW rätt när han menar att stacken allokeras när funktionen anropas, men som synes finns andra faktorer med i bilden, till exempel initering av variabler och komplexa datatyper såsom std::string.
Betänk följande kod:
// this function defines the variable "encrypted" too soon
string encryptPassword(const string& password)
{
string encrypted;
if (password.length() < MINIMUM_PASSWORD_LENGTH) {
throw logic_error("Password is too short");
}
//do whatever is necessary to place an encrypted
//version of password in encrypted;
return encrypted;
}
Följande kod kommer att gå snabbare:
// this function postpones "encrypted"'s definition until
// it's truly necessary
string encryptPassword(const string& password)
{
if (password.length() < MINIMUM_PASSWORD_LENGTH) {
throw logic_error("Password is too short");
}
string encrypted;
//do whatever is necessary to place an encrypted
//version of password in encrypted;
return encrypted;
}
Jag rekommenderar än en gång boken Effective C++ (från vilken exemplet är hämtat), för andra argument som talar för samma sak.
"By postponing variable definitions, you improve program efficiency, increase program clarity, and reduce the need to document variable meanings. It looks like it's time to kiss those block-opening variable definitions good-bye. "