speed up your qt 5 programs using c 11
play

Speed Up Your Qt 5 Programs Using C++11 Overview C++11 @ Qt 5.0 - PowerPoint PPT Presentation

Marc Mutz <marc@kdab.com> KDAB (DE), Qt Widget Maintenance Speed Up Your Qt 5 Programs Using C++11 Overview C++11 @ Qt 5.0 constexpr added to many types move semantics added to a few types initializer_list added to most types


  1. Marc Mutz <marc@kdab.com> KDAB (DE), Qt Widget Maintenance Speed Up Your Qt 5 Programs Using C++11

  2. Overview

  3. C++11 @ Qt 5.0 ● constexpr added to many types ● move semantics added to a few types ● initializer_list added to most types ● very few N-ary ctors marked explicit, N ≥ 2 ● = delete used almost ubiquitously ● noexcept added in a few central places ● other features not very usable in APIs

  4. A Simple Example Prevents optimisations...

  5. Results Less! Less! The C++11 Free Lunch Less! (GCC 4.8-20120823 / AMD64 / Linux) Baseline ( int main() {} )

  6. Whodunnit? The Qt-Project did... Whodunnit? This is magic...

  7. Whodunnit? C++98

  8. Whodunnit? C++11

  9. constexpr?

  10. constexpr ● New keyword in C++11 ● Can be applied to ● (Free and Member) Functions ● Variables ● Constructors ● Enables Evaluation at Compile-Time

  11. constexpr ● New keyword in C++11 constexpr constructor ● Can be applied to ● (Free and Member) Functions (also requires a trivial destructor) ● Variables “Literal Type” ● Constructors ● Enables Evaluation at Compile-Time const Type == compile-time constant

  12. constexpr

  13. constexpr .section .rodata “read-only data” .align 16 .type _ZL8triangle, @object .size _ZL8triangle, 24 _ZL8triangle: .long -50 .long 0 .long 50 C++11 .long 0 .long 0 .long 100

  14. constexpr And that is new... ...how? Well...

  15. constexpr “read-only data” [...] C++98 .section .ctors,"aw",@progbits .align 8 .quad _GLOBAL__sub_I_main .local _ZL8triangle .comm _ZL8triangle,24,16

  16. constexpr .type _GLOBAL__sub_I_main, @function _GLOBAL__sub_I_main: movl $-50, _ZL8triangle(%rip) “ D y movl $0, 4+_ZL8triangle(%rip) n a m i c movl $50, 8+_ZL8triangle(%rip) I n i t i a movl $0, 12+_ZL8triangle(%rip) l i s a t i o movl $0, 16+_ZL8triangle(%rip) n ” movl $100, 20+_ZL8triangle(%rip) ret “read-only data” [...] C++98 .section .ctors,"aw",@progbits .align 8 .quad _GLOBAL__sub_I_main .local _ZL8triangle .comm _ZL8triangle,24,16

  17. constexpr .type _GLOBAL__sub_I_main, @function ? Seriously??? _GLOBAL__sub_I_main: s t s movl $-50, _ZL8triangle(%rip) o “ D C y movl $0, 4+_ZL8triangle(%rip) n a p m i u c movl $50, 8+_ZL8triangle(%rip) I n t Multithreading: Data Race on Initialisation? i r t i a a movl $0, 12+_ZL8triangle(%rip) l </grey's anatomy> i s t a S t i o movl $0, 16+_ZL8triangle(%rip) n ” movl $100, 20+_ZL8triangle(%rip) ret Order of Initialisation? “read-only data” [...] C++98 .section .ctors,"aw",@progbits .align 8 .quad _GLOBAL__sub_I_main .local _ZL8triangle .comm _ZL8triangle,24,16

  18. constexpr

  19. constexpr _Z3onev: subq $40, %rsp movq %rsp, %rdi movl $-1, (%rsp) movl $-1, 4(%rsp) movq $0, 8(%rsp) movq $0, 16(%rsp) call _Z10checkIndexRK11QModelIndex@PLT addq $40, %rsp ret _Z3twov: leaq _ZL4root(%rip), %rdi jmp _Z10checkIndexRK11QModelIndex@PLT Tail Call Optimisation

  20. constexpr _Z3onev: subq $40, %rsp movq %rsp, %rdi ● compilers don't fold instances of literal types movl $-1, (%rsp) movl $-1, 4(%rsp) ● standard doesn't permit it movq $0, 8(%rsp) movq $0, 16(%rsp) ● addresses must be unique call _Z10checkIndexRK11QModelIndex@PLT addq $40, %rsp ● you need to do the folding yourself ret _Z3twov: ● learn to love static const variables :) leaq _ZL4root(%rip), %rdi jmp _Z10checkIndexRK11QModelIndex@PLT Tail Call Optimisation

  21. virtual functions T alking about embarrssments... Error: `timerEvnet(QTimerEvent*)` doesn't override anything! . . . e m i t n u r ) : p t u n e d m e e p p o s l e t v ' n e s d e t o u D b . . .

  22. Another Simple Example C++98: QString::fromUtf8() C++11: copy of a pointer C++11: won't throw

  23. Guidelines ● add Q_DECL_OVERRIDE to virtual overrides ● use static const type in favour of temporaries ● in apps, not DLLs/SOs/DYLIBs ● even when just default-constructed ● prefer unnamed over named temporaries ● use QStringLiteral ● qDebug() doesn't throw anymore

  24. C++11 @ Qt 5.1 (planned) ● add more constexpr ● add more noexcept ● add all missing move ctors ● experiment with rvalue refs on *this ● experiment with extern templates ● mark N-arg ctors explicit, N ≥ 2 ● add Q_DECL_OVERRIDE everywhere ● implement C++11 API on our containers

  25. Q & S Questions? Suggestions?

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend