Return of c++

957 views
806 views

Published on

A sharing session for the renaissance of C++ and the introduction of some C++11 features

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
957
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • Apart from C++, let people notice Objective-C,PHP, Python, Perl, and Ruby.
  • According to Bjarne…
  • Objective-C++: 2002Android support for C++ exceptions: NDK 5 (2010); shared C++ runtime w/ exceptions: NDK 7 (2011)
  • Many features rely on standard libraries too.The standard library definition is about 70% of the normative text of the standard…
  • Not supported by MSVC up to Visual Studio 2012
  • As of Boost 1.52.0.
  • As of Boost 1.52.0.
  • Return of c++

    1. 1. Return of C++
    2. 2. About Me• Software architect in Intel since December 2005• Focused on software design and network security before joining Intel• ~28 years since writing my first program – Programming is fun!• A casual open-source contributor – Several projects, but small contributions – Mostly on multi-lingual support (esp. Chinese)• A happy father of twins
    3. 3. Programming languages are a fashion world. Languages come, languages go....
    4. 4. Do you know the August ’12news in TIOBE Programming Community Index?
    5. 5. C++ dethroned from No. 3 … again
    6. 6. However, C++ is very muchactive, having been active for ~30 years.
    7. 7. Aims of C++• C++ makes programming more enjoyable for serious programmers.• C++ is a general-purpose programming language that – is a better C – supports data abstraction – supports object-oriented programming – supports generic programming
    8. 8. Some C++ Design Rules• C++’s evolution must be driven by real problems.• C++ must be useful now.• Don’t try to force people to use a specific programming style.• It is more important to allow a useful feature than to prevent every misuse.• Provide as good support for user-defined types as for built- in types.• What you don’t use, you don’t pay for (zero overhead rule).
    9. 9. C++ is biased towardssystems programming, why is it popular also inapplications programming?
    10. 10. Reason for C++ in Applications• Performance of a specialized language• Multiple categories in a complex application• Language mix issue• C++ library capabilities
    11. 11. Better C++ Support Coming• C++11 standardization• C++ native binding in Windows Runtime• C++ support to mix with Objective-C• Better C++ support in Android NDK• C++11 coming to MSVC, GCC, and Clang
    12. 12. Why the renaissance?
    13. 13. One word.
    14. 14. Mobile.
    15. 15. More words?
    16. 16. Performance/WPerformance/TPerformance/CPerformance/$
    17. 17. Good timing for the new C++11 standard....
    18. 18. Example• How short can you get in C++ to dispatch work to a new thread and get the result in the current thread?• Probably shorter than you expected: future<string> ft(async(...)); ... cout << ft.get();
    19. 19. Examplestring flip(string s){ reverse(s.begin(), s.end()); return s;}int main(){ vector<future<string>> v; v.push_back(async([] { return flip( " ,olleH"); })); v.push_back(async([] { return flip("n!letnI"); })); for (auto& e : v) { cout << e.get(); }}
    20. 20. Examplestring flip(string s){ reverse(s.begin(), s.end()); return s;}int main(){ vector<future<string>> v; v.push_back(async([] { return flip( " ,olleH"); })); v.push_back(async([] { return flip("n!letnI"); })); for (auto& e : v) { cout << e.get(); }}
    21. 21. Examplestring flip(string s){ reverse(s.begin(), s.end()); return s;}int main(){ vector<future<string>> v; v.push_back(async([] { return flip( " ,olleH"); })); v.push_back(async([] { return flip("n!letnI"); })); for (auto& e : v) { cout << e.get(); }}
    22. 22. Examplestring flip(string s){ reverse(s.begin(), s.end()); return s;}int main(){ vector<future<string>> v; v.push_back(async([] { return flip( " ,olleH"); })); v.push_back(async([] { return flip("n!letnI"); })); for (auto& e : v) { cout << e.get(); }}
    23. 23. Compiler Compatibility• Visual Studio 2012 – Pass• Clang 4.1 & libc++ (OS X) – Pass• Visual Studio 2010 – Range-based for and future are unsupported• GCC 4.7.2; ICC 13.0.1 (on top of VS2010) – future is unsupported
    24. 24. Incomplete List of C++11 Features• Rvalue references and move semantics Performance• Initializer lists• Range-based for-loop• Type inference (auto)• Lambda functions and expressions Usability• Explicit overrides and final• Null pointer constant (nullptr)• Right angle brackets• Unicode characters and strings• Multi-threading memory model Functionality• Static assertions• Smart pointers and other standard library improvements• …
    25. 25. Rvalue References and Move Semantics• Sorry, it might be too complex for a one-pager…• Problem: copying objects (containers) can be expensive• Key concepts: object lifecycle, temporary, lvalue, rvalue• Key result: able to take away the object content in a reasonable and consistent way, without surprises, via – A new reference type (&&) and related rules – Utilities to convert a type to rvalue reference type (like std::move) – Move functions to move content to the new object and erase the original• Demo of destructor elimination
    26. 26. Initializer Lists• C++98 allows code like this: int array[] = { 1, 2, 3, 4 };• C++11 now allows: vector<int> v = { 1, 2, 3, 4 };• And you can initialize your own container this way: MyContainer::MyContainer( std::initializer_list<Type> list) { ... }
    27. 27. Range-based for-loop• Example: for (int x : { 1, 1, 2, 3, 5 }) { cout << x << endl; }• It implicitly calls begin() and end() on the list/array/container.
    28. 28. Type Inference• Instead of writing: vector<boost::future<string> > ::iterator i = v.begin();• One can now simply write: auto i = v.begin();
    29. 29. Lambdas• Convenient where functors can be used – Say, for_each and transform• Each lambda has a different type – So auto is handy – Class template std::function can be used to store lambdas• Example: FILE* fp = fopen(...); ON_SCOPE_EXIT([&]() { fclose(fp); }); ...
    30. 30. Explicit Overrides and Final• Example struct Base { virtual void some(float); virtual void other(); }; struct Derived1 : Base { virtual void some(int) override; // error virtual void other() final; }; struct Derived2 : Derived1 { virtual void other(); // error };
    31. 31. Null Pointer Constant• The definition of NULL causes surprises for: void foo(char*); void foo(int); ... foo(NULL);• Now foo(nullptr) correctly calls foo(char*).
    32. 32. Right Angle Brackets• C++98 requires an extra space here: vector<list<string> > sv;• C++11 allows people to write: vector<list<string>> sv;
    33. 33. Unicode Characters and Strings• Example: char n[] = "GCC and MSVC encode differently: u2018."; wchar_t w[] = L"Is it 16-bit or 32-bit: u2018?"; char a[] = u8"UTF-8 string: u2018."; char16_t b[] = u"UTF-16 string: u2018."; char32_t c[] = U"UTF-32 string: u2018.";
    34. 34. Multi-Threading Memory Model• Another complex topic• Memory model is defined• Standard library facilities: – Mutexes, conditional variables, RAII locks – Futures and promises (first example) – Atomic operations
    35. 35. Static Assertions• Example: template<class T> struct Check { static_assert(sizeof(int) <= sizeof(T), "T is not big enough!"); }; void DoSomething(...) { static_assert(sizeof(void*) == 4, "Supports only 32-bit platforms"); ... }
    36. 36. Smart Pointers• Example: unique_ptr<int> p1(new int(5)); unique_ptr<int> p2 = p1; // compile error unique_ptr<int> p3 = move(p1); // transfers ownership. p3.reset(); // deletes the memory. p1.reset(); // does nothing. shared_ptr<int> p1(new int(5)); // refcount = 1 shared_ptr<int> p2 = p1; // refcount = 2 p1.reset(); // refcount = 1 p2.reset(); // refcount = 0; frees memory
    37. 37. Summary• Mobile and cloud make C++ relevant again.• The new C++11 standard makes C++ a more powerful but easier-to-use language. – Definitely worth adopting – Especially for application developers• Today is just an introduction.
    38. 38. References• ISO/IEC JTC 1/SC22: N3337 – Draft C++ Standard (very close to C++11)• Bjarne Stroustrup: Evolving a language in and for the real world: C++ 1991-2006• Bjarne Stroustrup: An Overview of the C++ Programming Language• Scott Meyers: Summary of C++11 Feature Availability in gcc and MSVC• Wikipedia: C++11• 刘未鹏: C++11 (及现代C++风格)和快速迭代式开发• Stephan T. Lavavej: Lambdas, auto, and static_assert: C++0x Features in VC10, Part 1• Stephan T. Lavavej: Rvalue References: C++0x Features in VC10, Part 2• Stephan T. Lavavej: decltype: C++0x Features in VC10, Part 3• Thomas Becker: C++ Rvalue References Explained• Herb Sutter: C++ and Beyond 2011: Herb Sutter - Why C++?• Andrei Alexandrescu, Scott Meyers, Herb Sutter: On Static If, C++11 in 2012, Modern Libraries, and Metaprogramming• Nicolai M. Josuttis: The C++ Standard Library: A Tutorial and Reference (2nd Edition). Addison-Wesley, 2012
    39. 39. Backup
    40. 40. Poor Man’s Future – Option 1static string tmp1() { return flip( " ,olleH"); }static string tmp2() { return flip("n!letnI"); }int main(){ vector<boost::future<string>> v; v.push_back(boost::async(tmp1)); v.push_back(boost::async(tmp2)); for (auto i = v.begin(); i != v.end(); ++i) { cout << i->get(); }}
    41. 41. Poor Man’s Future – Option 2int main(){ vector<boost::future<string>> v; { boost::packaged_task<string> pt([] { return flip( " ,olleH"); }); v.push_back(pt.get_future()); boost::thread task(boost::move(pt)); } { boost::packaged_task<string> pt([] { return flip("n!letnI"); }); v.push_back(pt.get_future()); boost::thread task(boost::move(pt)); } for (auto i = v.begin(); i != v.end(); ++i) { cout << i->get(); }}
    42. 42. Use Boost with MSVC• Most of Boost can be used without building• One needs to add the include path BOOST – For IDE: Tools > Options > Projects > VC++ Directories > Include files – For command line: the environment variable INCLUDE• Some components need building, like the unit test framework b2 toolset=msvc-10.0 --with-test debug link=static runtime- link=static stage b2 toolset=msvc-10.0 --with-chrono --with-date_time --with- system --with-thread debug release link=static runtime- link=static stage• One then needs to add the library path BOOSTstagelib – For IDE: Tools > Options > Projects > VC++ Directories > Library files – For command line: the environment variable LIB

    ×