aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--nrvo_by_default/Makefile26
-rw-r--r--nrvo_by_default/nmake.mk21
-rw-r--r--nrvo_by_default/rvo.cpp73
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;
+}