Re: We do not use C++ exceptions at Google
On Jan 15, 6:08 pm, Marsh Ray <marsh...@gmail.com> wrote:
On Jan 15, 10:30 am, Maxim Yegorushkin <maxim.yegorush...@gmail.com>
wrote:
Practically, I haven't seen a case
where cant-be-null property of references would make a difference
for
function arguments.
int a = 0, b = 1;
std::swap<int>(a, b); // Probably pretty darn efficient.
It as efficient as swap_c_style. See below.
swap_c_style(&a, &b);
The implementation of swap_c_style has to either check both args for
null, or produce undefined behavior over its domain of input values.
No checks necessary, it should just dump a core file for your
examination.
The compiler probably has a harder job optimizing away the case where
(*a == *b), too.
Why would it? A reference argument to a function is the same as a
pointer argument on the binary level.
Let's compare optimised versions of std::swap<int, int>() and
swap_c_style<int>():
[max@truth test]$ g++ --version
g++ (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8)
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There
is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.
[max@truth test]$ cat test.cc
#include <algorithm>
template<class T>
void swap_c_style(T* a, T* b)
{
T t(*a);
*a = *b;
*b = t;
}
int main()
{
int a = 1, b = 2;
std::swap(a, b);
swap_c_style(&a, &b);
}
[max@truth test]$ g++ -O3 -fomit-frame-pointer -fno-inline -ggdb -Wall
-Wextra -o test.o test.cc
[max@truth test]$ objdump --syms test.o | grep swap | c++filt
08048460 w F .text 00000013 void swap_c_style<int>
(int*, int*)
08048440 w F .text 00000013 void std::swap<int>(int&,
int&)
[max@truth test]$ objdump -d --start-address=0x08048460 --stop-
address=0x08048473 test.o | c++filt
test.o: file format elf32-i386
Disassembly of section .text:
08048460 <void swap_c_style<int>(int*, int*)>:
8048460: 53 push %ebx
8048461: 8b 54 24 08 mov 0x8(%esp),%edx
8048465: 8b 4c 24 0c mov 0xc(%esp),%ecx
8048469: 8b 1a mov (%edx),%ebx
804846b: 8b 01 mov (%ecx),%eax
804846d: 89 02 mov %eax,(%edx)
804846f: 89 19 mov %ebx,(%ecx)
8048471: 5b pop %ebx
8048472: c3 ret
[max@truth test]$ objdump -d --start-address=0x08048440 --stop-
address=0x08048453 test.o | c++filt
test.o: file format elf32-i386
Disassembly of section .text:
08048440 <void std::swap<int>(int&, int&)>:
8048440: 53 push %ebx
8048441: 8b 54 24 08 mov 0x8(%esp),%edx
8048445: 8b 4c 24 0c mov 0xc(%esp),%ecx
8048449: 8b 1a mov (%edx),%ebx
804844b: 8b 01 mov (%ecx),%eax
804844d: 89 02 mov %eax,(%edx)
804844f: 89 19 mov %ebx,(%ecx)
8048451: 5b pop %ebx
8048452: c3 ret
Can you spot the difference?
--
Max
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]