From 2b7c83bfbf5b149ad885937563e05bb7db42ce0c Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 23 Mar 2015 12:49:01 +0100 Subject: [PATCH] Tests: Add a shootout test for implementations of operator== That's for a structure mimicking QMakeStepConfig, comparing a.x == b.x && a.y == b.y ... with std::tie(a.x, a.y, ...) == std::tie(b.x, b.y, ...) Executive summary: gcc 4.9.1 optimizes the traditional == && == better. This is solely due to the sequence of four bools in the struct. Change-Id: I77cc8d685c6b7b7ead651cd1f44ff1b2e9b39f3d Reviewed-by: Daniel Teske --- tests/manual/shootout/tst_codesize.cpp | 46 ++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/manual/shootout/tst_codesize.cpp b/tests/manual/shootout/tst_codesize.cpp index 0fc053721c7..f3907d6dd29 100644 --- a/tests/manual/shootout/tst_codesize.cpp +++ b/tests/manual/shootout/tst_codesize.cpp @@ -165,6 +165,7 @@ void tst_CodeSize::codesize() QFile mainPro(t->buildPath + "/main.pro"); QVERIFY(mainPro.open(QIODevice::ReadWrite)); mainPro.write("\n\nSOURCES += main.cpp"); + mainPro.write("\nCONFIG += c++11\n"); QFile mainCpp(t->buildPath + QLatin1String("/main.cpp")); QVERIFY(mainCpp.open(QIODevice::ReadWrite)); @@ -355,6 +356,51 @@ void tst_CodeSize::codesize_data() QTest::newRow("lambdas") << s; s.clear(); + + + QByteArray std_tie_code = + "struct QMakeStepConfig\n" + "{\n" + " enum TargetArchConfig { NoArch, X86, X86_64, PPC, PPC64 };\n" + " enum OsType { NoOsType, IphoneSimulator, IphoneOS };\n" + "\n" + " QMakeStepConfig()\n" + " : e1(NoArch),\n" + " e2(NoOsType),\n" + " b1(false),\n" + " b2(false),\n" + " b3(false),\n" + " b4(false)\n" + " {}\n" + "\n" + " TargetArchConfig e1;\n" + " OsType e2;\n" + " bool b1;\n" + " bool b2;\n" + " bool b3;\n" + " bool b4;\n" + "};\n"; + + c.file = "std__tie"; + c.gist = "std::tie"; + c.code = "#include \n" + std_tie_code + + "bool operator ==(const QMakeStepConfig &a, const QMakeStepConfig &b) {\n" + " return std::tie(a.e1, a.e2, a.b1, a.b2, a.b3, a.b4)\n" + " == std::tie(b.e1, b.e2, b.b1, b.b2, b.b3, b.b4);\n" + "}\n"; + s.cases.append(c); + + c.file = "conventional"; + c.gist = "conventional"; + c.code = "" + std_tie_code + + "bool operator ==(const QMakeStepConfig &a, const QMakeStepConfig &b) {\n" + " return a.e1 == b.e1 && a.e2 == b.e2 && a.b1 == b.b1\n" + " && a.b2 == b.b2 && a.b3 == b.b3 && a.b4 == b.b4;\n" + "}\n"; + s.cases.append(c); + + QTest::newRow("std_tie") << s; + s.clear(); } int main(int argc, char *argv[])