On Wednesday 14 October 2015 08:51:11 Thiago Macieira wrote: > The separation of the string itself from the size and the d pointer allows > the compiler, if it wants to, to share strings. In fact, disassembly of > > f(QStringLiteral("foo"), QStringLiteral("foo")) > > produces one copy of u"foo" only.
Let me expand on this. Current Qt5 QStringLiteral("foo") produces a data block of size sizeof(QArrayData) + sizeof(u"foo") = 24 + 8 = 32 bytes and the fact that QStringLiterals don't share will cause the innocent-looking above code require 64 bytes of read-only data. My current code expands to 8 bytes of read-only data, at the expense of a little more code. Current code: leaq _ZZZ1fvENKUlvE0_clEvE15qstring_literal(%rip), %rax movq %rax, 16(%rsp) leaq _ZZZ1fvENKUlvE_clEvE15qstring_literal(%rip), %rax movq %rax, (%rsp) ; followed by the call: movq %rsp, %rdi leaq 16(%rsp), %rsi call _Z1fRK7QStringS1_@PLT My code: leaq .LC0(%rip), %rcx ; u"foo" movq _ZN10QArrayData18shared_static_dataE@GOTPCREL(%rip), %rax movq %rcx, 40(%rsp) movl $3, 48(%rsp) movq %rcx, 8(%rsp) movq %rax, 32(%rsp) movq %rax, (%rsp) movl $3, 16(%rsp) ; the call itself is unchanged: movq %rsp, %rdi leaq 32(%rsp), %rsi call _Z1fRK7QStringS1_@PLT -- Thiago Macieira - thiago.macieira (AT) intel.com Software Architect - Intel Open Source Technology Center _______________________________________________ Development mailing list Development@qt-project.org http://lists.qt-project.org/mailman/listinfo/development