diff options
Diffstat (limited to '')
-rw-r--r-- | nrvo_by_default/Makefile | 26 | ||||
-rw-r--r-- | nrvo_by_default/nmake.mk | 21 | ||||
-rw-r--r-- | nrvo_by_default/rvo.cpp | 73 |
3 files changed, 120 insertions, 0 deletions
diff --git a/nrvo_by_default/Makefile b/nrvo_by_default/Makefile new file mode 100644 index 0000000..f9fd487 --- /dev/null +++ b/nrvo_by_default/Makefile @@ -0,0 +1,26 @@ +# Builds rvo.cpp on various optimization levels supported by GCC. +# The compiler is `g++` by default. +# You can change the compiler to be used using the CXX variable. +# For example, if you want to compile using `x86_64-w64-mingw32-g++`, run +# +# > make CXX=x86_64-w64-mingw32-g++ + +CXXFLAGS = -Wall -Wextra -DNDEBUG -std=c++11 -static-libgcc -static-libstdc++ -s + +optimization_levels = 0 1 2 3 + +all:: + +define make_target +rvo.$(CXX).O$(1).exe: rvo.cpp + $(CXX) $(CXXFLAGS) -O$(1) $$< -o $$@ + +all:: rvo.$(CXX).O$(1).exe +endef + +$(foreach i,$(optimization_levels),$(eval $(call make_target,$(i)))) + +.PHONY: clean-all + +clean-all: + $(RM) $(wildcard rvo.$(CXX).*.exe) diff --git a/nrvo_by_default/nmake.mk b/nrvo_by_default/nmake.mk new file mode 100644 index 0000000..45aefd4 --- /dev/null +++ b/nrvo_by_default/nmake.mk @@ -0,0 +1,21 @@ +CXXFLAGS = /nologo /W4 /EHsc /MT /DNDEBUG + +all: rvo.cl.Od.exe rvo.cl.O1.exe rvo.cl.O2.exe rvo.cl.Ox.exe + +rvo.cl.Od.exe: rvo.cpp + $(CXX) $(CXXFLAGS) /Od /Fe:$@ $** + +rvo.cl.O1.exe: rvo.cpp + $(CXX) $(CXXFLAGS) /O1 /Fe:$@ $** + +rvo.cl.O2.exe: rvo.cpp + $(CXX) $(CXXFLAGS) /O2 /Fe:$@ $** + +rvo.cl.Ox.exe: rvo.cpp + $(CXX) $(CXXFLAGS) /Ox /Fe:$@ $** + +clean: + del rvo.obj + +clean-all: clean + del rvo.cl.*.exe diff --git a/nrvo_by_default/rvo.cpp b/nrvo_by_default/rvo.cpp new file mode 100644 index 0000000..f8c8f32 --- /dev/null +++ b/nrvo_by_default/rvo.cpp @@ -0,0 +1,73 @@ +#include <iostream> +#include <utility> + +namespace +{ + class C + { + public: + explicit C() + { + std::cout << "\tC::C()\n"; + } + + C(C&&) noexcept + { + std::cout << "\tC::C(C&&)\n"; + } + + C(const C&) + { + std::cout << "\tC::C(const C&)\n"; + } + + C& operator=(C&&) noexcept + { + std::cout << "\tC::operator=(C&&)\n"; + return *this; + } + + C& operator=(const C&) + { + std::cout << "\tC::operator=(const C&)\n"; + return *this; + } + + ~C() + { + std::cout << "\tC::~C()\n"; + } + }; + + C make_rvo() + { + return C{}; + } + + C make_nrvo() + { + C c; + return c; + } +} + +int main() +{ + { + std::cout << "C c\n"; + C c; + } + { + std::cout << "C c(make_rvo())\n"; + C c(make_rvo()); + } + { + std::cout << "C c{make_rvo()}\n"; + C c{make_rvo()}; + } + { + std::cout << "C c = make_rvo()\n"; + C c = make_rvo(); + } + return 0; +} |