рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдмрдиреАред
рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╢рдмреНрдж
рдХреЛрдб рдмреНрд▓реЛрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред C ++ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдореЗрдВ
рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╡реГрджреНрдзрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХреЛрдб рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рдпрд╛рдиреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдЯреА рдлреВ (рдЯреА рдП); int рдФрд░ char рджреЛ рднрд┐рдиреНрди рдХрд╛рд░реНрдп рд╣реИрдВред рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рддреЛ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдХреЗ, рдпрд╛ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЪрд▓реЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрдВрджрд░ рдмрд╛рд╣рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдХреА рдиреНрдпреВрдирддрдо рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕рдВрднрд╡ рдЖрдХрд╛рд░ рдХреА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдирд╣реАрдВ рдерд╛ - рдореБрдЭреЗ рдХреЗрд╡рд▓ 60 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдХреЛрдб рдХреА 53 рдПрдордмреА рдорд┐рд▓реАред рдФрд░ рдлрд┐рд░ рдХреЗрд╡рд▓ рддреАрди рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рд╕рдВрдХрд▓рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдФрд░ рд╕рдВрдХрд▓рди рдХреЗ рдХрдИ рдШрдВрдЯреЛрдВ рдХреА рд▓рд╛рдЧрдд рдкрд░ред 14MB рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдорд╛рддреНрд░рд╛ / рд▓рд╛рдЗрди рдЕрдиреБрдкрд╛рдд 2.3MB / рдкрдВрдХреНрддрд┐ рд╣реИред
рдпрд╣ рдХреИрд╕реЗ рдФрд░ рдХреНрдпреЛрдВ рд╣реБрдЖ - рдХрдЯ рдХреЗ рддрд╣рддред
рд╕рд╛рдзрди
4GB рдореЗрдореЛрд░реА рд╡рд╛рд▓рд╛ рдПрдХ рд▓реИрдкрдЯреЙрдк,
Intel┬о Core (TM) i3-2330M CPU @ 2.20GHz рдкреНрд░реЛрд╕реЗрд╕рд░,
рд▓рд┐рдирдХреНрд╕ рдУрдПрд╕ 3.7.3-101.fc17.x86_64
рдФрд░ рдПрдХ рдЕрдХреНрд╖рдо рд╕реНрд╡реИрдк рд╡рд┐рднрд╛рдЬрдиред
рд╕реНрд╡реИрдк рдХреЛ рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЬрд┐рд╕ рдХрд╛рд░рдг рдкреЛрд╕реНрдЯ рд╢реАрд░реНрд╖рдХ рдореЗрдВ рдХрд╛рдВрдЯрд╛ рдмрдо рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдХрд╛рд░реНрдп рдХреА рдкрд░реНрдпрд╛рдкреНрдд рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдХреЗ рд╕рд╛рде, рд╕рдВрдХрд▓рдХ рдиреЗ рд╕рднреА рдореЗрдореЛрд░реА рдХреЛ рдЦрд╛ рд▓рд┐рдпрд╛ рдФрд░ рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдирд┐рдордп рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдЬреЛ рдорд╢реАрди рдХреЛ рдХрд╕рдХрд░ рдФрд░ рд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ред
рд╕рдВрдХрд▓рдХ рд╕рдВрд╕реНрдХрд░рдг:
- g ++ (GCC) 4.7.2 20120921 (рд░реЗрдб рд╣реИрдЯ 4.7.2-2)
- Intel┬о C ++ Intel┬о 64 рдХрдВрдкрд╛рдЗрд▓рд░ XE Intel┬о 64, рд╕рдВрд╕реНрдХрд░рдг 13.1.1.163 рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП 20130313 рдмрдирд╛рдПрдБ
- рдХреНрд▓реИрдВрдЧ рд╕рдВрд╕реНрдХрд░рдг 3.3 (рдЯреНрд░рдВрдХ 179304)
рд▓рдВрдмреА рд╕рд░рдгрд┐рдпрд╛рдБ
рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЙрд╕ рдкрд░ рд╕рдВрдХрд▓рди рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЪрд░рдг рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рддрд░рд╣:
template<long n> inline void nop(){nop<n-1>();asm("nop"); } template<> inline void nop<0>() {asm("nop");} int main(int argc, char ** argv) { nop<LVL>(); return 0; }
рдирддреАрдЬрддрди, рдореБрдЦреНрдп () рдлрд╝рдВрдХреНрд╢рди рдЦрд╛рд▓реА
рдмреЗрдХрд╛рд░ рдПрдирдУрдкреА рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рднрд░рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдиреБрдХреНрд░рдо рдПрдирдУрдкреА рдХрд╛ рдЖрдХрд╛рд░ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЬреА ++ рдорди рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрддрдо рдЧрд╣рд░рд╛рдИ 17 рдФрд░ 1024 рд╕реА ++ 11 рдХреЗ рд▓рд┐рдП рд╣реИред
рдорди рд╕реЗ рдмреЛрд▓реА-рдлреЗрдЯрдкреНрд▓реЗрдЯ-рдЧрд╣рд░рд╛рдИ = рдПрди
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдЧрд╣рд░рд╛рдИ рдХреЛ n рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдЧрд╣рд░рд╛рдИ рдкрд░ рдПрдХ рд╕реАрдорд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рджреМрд░рд╛рди рдЕрдВрддрд╣реАрди рдордВрджреА рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред ANSI / ISO C ++ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЕрдзрд┐рдХрддрдо рдЧрд╣рд░рд╛рдИ 17 рд╕реЗ рдЕрдзрд┐рдХ (рд╕реА ++ 11 рдореЗрдВ 1024 рдореЗрдВ рдмрджрд▓ рдЧрдИ)ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди 900 рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдмрд╛рд╣рд░ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИ
рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ 1024 рдорд╛рд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдЯреИрдХ рд╕реНрдкреЗрд╕ред
рдореБрдЭреЗ рдорд╛рдирдХреЛрдВ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рдорд┐рд▓реАред рдХреЗрд╡рд▓ рдпрд╣ рдмрд┐рдВрджреБ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЕрдзрд┐рдХрддрдо рдЧрд╣рд░рд╛рдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ:
рд╕реА ++ 03 рдХреЗ рд▓рд┐рдП 4.7.1.14
рд╕реА ++ 11 рдХреЗ рд▓рд┐рдП 4.7.1.15
рдЬрд┐рд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдЕрдиреБрднрд╡ рд╕реЗ рд╣реБрдИред рдПрдХ рдмрдбрд╝реЗ рдкрд░реНрдпрд╛рдкреНрдд LVL рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЧрдпрд╛ред Cl ++ рджреНрд╡рд╛рд░рд╛ рдЪрдХрд┐рдд, рдЬреЛ 2
13 рдкрд░ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЧрдпрд╛, g ++ рдФрд░ icpc рдХреЗ рд╡рд┐рдкрд░реАрдд 2
17 рддрдХ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ред
рдЯреАрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рдмрд╛рд╣рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
clang++ -DLVL=$(( 2**$n)) -o list$n ./list.cc -ftemplate-depth=3000000 -O$x g++ -DLVL=$(( 2**$n)) -o list$n ./list.cc -ftemplate-depth=3000000 -O$x icpc -DLVL=$(( 2**$n)) -o list$n ./list.cc -O$x
рдЕрдВрджрд░
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдХреВрд▓рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдПред рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкрд░рд┐рдгрд╛рдо рд░реЗрдЦрд╛рдВрдХрди рдореЗрдВ рджрд┐рдЦрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЪрд╛рд░ рдЫрд╡рд┐ рд╕реНрддрдВрдн:
- рд╕рдордп рдкрд░ рдкреНрд░рдпреБрдХреНрдд рд╕реНрдореГрддрд┐ рдХреА рдирд┐рд░реНрднрд░рддрд╛ред рдпреЗ рд░реЗрдЦрд╛рдВрдХрди рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рд╣реИрдВред рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди, рдПрдХреНрд╕-рд╕рд░реНрд╡рд░ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЦреНрдп рд░реБрдЭрд╛рди рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВред
- рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ред рдЕрдзрд┐рдХрддрдо рдирд┐рдХрд▓рд╛ - 14 рдПрдордмреА
- рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдЗрдирд▓рд╛рдЗрди рдХреАрд╡рд░реНрдб рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрдбрд╝реЗ рдПрди рдХреЗ рд▓рд┐рдП рдПрдирдУрдкреА рдХреЛ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдмрд╛рдВрдЯрд╛ рдЧрдпрд╛ рд╣реИред рдЗрдирдХреА рдЧрдгрдирд╛ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ:
nm --demangle ./list$i|grep nop|wc -l
- рдИрдорд╛рдирджрд╛рд░ рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ред Disassembler рд╕реЗ рдкрд░рд┐рдХрд▓рд┐рдд:
objdump -d ./list$i|grep 'nop$'|wc -l
рдпрд╣ рдХреЗрд╡рд▓ рдХреНрд░реЛрдо рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рджреЗрдЦрддрд╛ рд╣реИредрдЕрдиреНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдФрд░ рд╕рднреА рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде
рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рд▓рд┐рдВрдХ
рддрд╕реНрд╡реАрд░реЗрдВрдПрдХ рд╣реА рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреВрд▓рди рд╕реНрддрд░реЛрдВ рдХреА рддреБрд▓рдирд╛
рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд
| рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░
| рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛
| рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдПрдирдУрдкреА
|
---|
|
|
|
|
|
|
|
|
|
|
|
|
рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреВрд▓рди рд╕реНрддрд░реЛрдВ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдХрд▓рдХ рдХреА рддреБрд▓рдирд╛
рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд
| рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░
| рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛
| рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдПрдирдУрдкреА
|
---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2
17 icpc рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░ 14MB рдерд╛ред рдЬреА ++ рдХреЗ рд▓рд┐рдП - 12 рдПрдордмреАред рджреЛрдиреЛрдВ O0 рдкрд░ред рдЕрдиреБрдХреВрд▓рди рд╕реНрддрд░ O0 рдЗрдирд▓рд╛рдЗрди рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, nop <long> рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ nop рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддреА рд╣реИред
рд▓рдореНрдмреЗ рдкреЗрдбрд╝
рдПрдХ рд░реЗрдЦреАрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП, рдЙрддреНрдкрдиреНрди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдХрдо рд╕реЗ рдХрдо рдЕрдзрд┐рдХрддрдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЧрд╣рд░рд╛рдИ (рдХреНрд▓реЗрдВрдЧ ++ рдХреЗ рд▓рд┐рдП 256, рдЬреА ++ рдХреЗ рд▓рд┐рдП 900) рддрдХ рд╕реАрдорд┐рдд рд╣реИред рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдкреЗрдбрд╝ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдХрд▓рди рдЪрд░рдг рд╡реГрдХреНрд╖ рдХреА рдЕрдзрд┐рдХрддрдо рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЧрд╣рд░рд╛рдИ рд╣реИ (sizeof (рд▓рдВрдмреА) -1) == 63. рдФрд░ 2
64 рдмрд╛рдЗрдЯреНрд╕ рдХрд┐рд╕реА рднреА рдбрд┐рд╕реНрдХ рдХреЛ рдУрд╡рд░рдлреНрд▓реЛ рдХрд░реЗрдВрдЧреЗред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕реАрдорд╛ рдмрд╣реБрдд рдХрдо рд╣реИред
рдПрдХ рдкреЗрдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рд╣рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЕрдзрд┐рдХрддрдо рдЧрд╣рд░рд╛рдИ рд╕реЗ рдкрд░реЗ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВред
рд╕реНрд░реЛрдд рдХреЛрдб 19 рд▓рд╛рдЗрдиреЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
#ifndef LVL # define LVL 3 #endif long x = 0; template<int N=LVL, long I=0> struct foo{ inline static double bar(double m) {x++;return foo<N-1,I>::bar(m) + foo<N-1,((1<<(LVL-N))|I)>::bar(m) + I;}; }; template<long I> struct foo<0,I>{ inline static double bar(double m) {x++; return m;} }; #include <iostream> int main(int argc, char **argv){ double ret = foo<>::bar(argc); std::cout << x << " " << ret << std::endl; return int(ret); }
рдкрд░рд┐рдгрд╛рдо рдПрдХ рдкреЗрдбрд╝ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХрд╛ рдЕрдкрдирд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ:
- рдПрди - рд╕реНрддрд░ рд╕рдВрдЦреНрдпрд╛;
- рдореИрдВ рд╕реНрддрд░ рдкрд░ рдиреЛрдб рд╕рдВрдЦреНрдпрд╛ рд╣реВрдВред
рдПрдХ рд╕реНрддрд░ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЛ 0 рд╕реЗ рдПрди рддрдХ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдпрд╣рд╛рдБ nop рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЧрдбрд╝рдмрдбрд╝ рдирд╣реАрдВ рдХреА, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧреНрд▓реЛрдмрд▓ рд▓реЙрдиреНрдЧ x - рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╣реА рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, 2
LVL + 1 рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЯреАрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рдмрд╛рд╣рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
clang++ -DLVL=$n -o fbomb$n ./fbomb.cc -O$x g++ -DLVL=$n -o fbomb$n ./fbomb.cc -O$x icpc -DLVL=$n -o fbomb$n ./fbomb.cc -O$x
рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВред
Clang ++ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо LVL 18 рдерд╛ред G ++ рдФрд░ icpc - 16 рдХреЗ рд▓рд┐рдП, рднрд▓реЗ рд╣реА рд╡рд┐рдХрд▓реНрдк --std = c ++ 11 рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рдпрд╛ рдирд╣реАрдВред рд╕рдВрдХрд▓рдХ рд╕реНрдореГрддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рднрд╛рдЧ рдЧрдпрд╛ред
рдпрд╣ рдХреЗрд╡рд▓ рдХреНрд░реЛрдо рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рджреЗрдЦрддрд╛ рд╣реИредрдЕрдиреНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдФрд░ рд╕рднреА рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде
рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рд▓рд┐рдВрдХ
рдкреЗрдбрд╝ рдХреЗ рд▓рд┐рдП рдЪрд┐рддреНрд░рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд
| рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░
| рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛
|
---|
|
|
|
|
|
|
|
|
|
рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд
| рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░
| рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛
|
---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
рдЕрдзрд┐рдХрддрдо рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░:
- 43 рдПрдордмреА рдХреЗ рд▓рд┐рдП icpc -O0 -DLVL = 17;
- рдХреНрд▓реИрдВрдЧ ++ -O0 -DLVL = 17 рдХреЗ рд▓рд┐рдП 42 рдПрдордмреА;
- 22 ++ рдХреЗ рд▓рд┐рдП g ++ -O0 -DLVL = 16ред
рд╕реНрдкрд╖реНрдЯ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛
43 рдПрдордмреА - рдЗрддрдирд╛ рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд░реИрдо рдХреА рджреА рдЧрдИ рд░рд╛рд╢рд┐ рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдФрд░ рднреА рдмрдбрд╝рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдпрд╣ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рддреАрди рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ - рдЖрдИрд╕реАрдкреАрд╕реАред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд╛рд╣рд░реА рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдФрд░ рд╕реНрдкрд╖реНрдЯ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рдо рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрд╕рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рдо рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рддреАрди рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдПрдХ рд╡рд┐рд╡рд░рдг, рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдФрд░ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрдВрд╢рд┐рдХ рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди:
fbomb.hh extern long x; template<int L=LVL, int N=L, long I=0> struct foo{ inline static double bar(double m) {x++;return foo<L,N-1,I>::bar(m) + foo<L,N-1,((1<<(LN))|I)>::bar(m) + I;}; }; template<int L, long I> struct foo<L,0,I>{ inline static double bar(double m) {x++; return m;} };
part.cc template class foo<LVL, _L, _I>;
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЬреА ++ -c main.cc -DLVL = 21 рдорд╛рдирдХ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдХреНрд░реИрд╢ред рдХреНрд▓реИрдВрдЧ ++ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд╕реНрдерд┐рддрд┐ред Icpc рдПрдХ рд╕реЗрдХрдВрдб рд╕реЗ рднреА рдХрдо рд╕рдордп рдореЗрдВ main.cc рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЙрдк-рд╕рдВрдХрд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ 4 рдШрдВрдЯреЗ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рд╕рдордп рд▓рдЧрд╛:
for i in $(seq 0 31);do echo -n "$i:";date; icpc -O2 -c ./part.cc -o part21_16_$io -DLVL=21 -D_L=16 -D_I=$i;sleep 10; done
рдЙрдк-рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рд▓рд┐рдВрдХрд┐рдВрдЧ рдореЗрдВ рдПрдХ рдорд┐рдирдЯ рд╕реЗ рднреА рдХрдо рд╕рдордп рд▓рдЧрд╛ред рдкрд░рд┐рдгрд╛рдо рдПрдХ 53MB рдлрд╝рд╛рдЗрд▓ рд╣реИред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ -O2 рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред -O0 рдПрдХ рдмрдбрд╝рд╛ рдЖрдХрд╛рд░ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рдордп
рдФрд░ рдЕрд░реНрдерд╣реАрдирддрд╛ рдХреЗ рдХрд╛рд░рдг рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрдИ рдмрд╛рд░ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдЕрдиреБрдкрд╛рдд / рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ = 2.3MB / рд░реЗрдЦрд╛ рдкрд╣рд▓реЗ рднрд╛рдЧ (icpc -O0 list.cc) рд╕реЗ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
рдореАрдЯреНрд░рд┐рдХ рдмреЗрд╢рдХ рдордЬрд╝рд╛рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдордЬрд╝реЗрджрд╛рд░ рд╣реИред реи.рей - рдЕрдзрд┐рдХрддрдо рдЬреЛ рд╣реБрдЖред рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдХрд░ рдЦрд╝реБрд╢реА рд╣реЛрдЧреА рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдмрдбрд╝рд╛ рд░реБрдЦ рдорд┐рд▓реЗрдЧрд╛ред
рд╣рдо рд╕рднреА рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБред
рдЕрдкрдбреЗрдЯ : рд╕реНрдЯреНрд░рд┐рдк рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдХреБрдЫ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдереЗ - рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рд╢рдд рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдХрд▓рд╛, рдФрд░ рдХрд╛рдлреА рдмрдбрд╝рд╛ рдерд╛ред рдкрдЯреНрдЯреА рдХреЗ рдмрд╛рдж, рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ 37 рдПрдордмреА (53 рд╕реЗ) рддрдХ рдЧрд┐рд░ рдЧрдпрд╛ред рдФрд░ 8.6MB (14 рд╕реЗ)ред рддрджрдиреБрд╕рд╛рд░, рдЕрдиреБрдкрд╛рдд 1.43 рдПрдордмреА / рд░реЗрдЦрд╛ рд╣реИред