Differences between revisions 27 and 39 (spanning 12 versions)
Revision 27 as of 2017-08-04 19:33:54
Size: 5964
Editor: SamatJain
Comment:
Revision 39 as of 2020-09-02 20:49:51
Size: 5933
Editor: SamatJain
Comment: Iterating over maps
Deletions are marked like this. Additions are marked like this.
Line 52: Line 52:
=== Thread safety analysis (TSA) ===

Documentation:

 * [[https://insights.sei.cmu.edu/sei_blog/2014/10/thread-safety-analysis-in-c-and-c.html|Thread Safety Analysis in C and C++]]: CMU blog article on TSA
 * [[https://reviews.llvm.org/D14731|Thread safety analysis support for libc++, annotating mutex, lock_guard, etc]]
 * [[https://news.ycombinator.com/item?id=13981267|Hacker News discussion on thread safety analysis in clang]]

Example projects:

 * [[https://github.com/ClangBuiltLinux/thread-safety-analysis|ClangBuiltLinux/thread-safety-analysis]]: Linux kernel w/ TSA annotations
 * Chromium, annotation macros, from [[https://github.com/chromium/chromium/blob/master/base/thread_annotations.h|base/thread_annotations.h]]. Macros are named different, and they use deprecated TSA names.

=== Lifetime safety analysis ===

 * [[https://herbsutter.com/2018/09/20/lifetime-profile-v1-0-posted/|Lifetime profile v1.0 posted]], initial blog post by Herb Sutter, with link to the [[https://github.com/isocpp/CppCoreGuidelines/blob/master/docs/Lifetime.pdf|Lifetime profile v1.0 paper]]
 * [[https://github.com/mgehre/llvm-project|mgehre/llvm-project]]: clang implementation
 * note: gsl = Guidelines Support Library
Line 53: Line 72:

 * Namespacing enums in pre-C++11: https://stackoverflow.com/questions/482745/namespaces-for-enum-types-best-practices#484304
Line 71: Line 92:
For iterating over maps:

{{{#!highlight c++ numbers=off
// Nothing changed
for (const auto& [key, value]: some_map) { observ(value); }
for (auto& [key, value]: some_map) { value.change(); }
}}}
Line 86: Line 115:
Notes:

 * https://twitter.com/michael90187356/status/1245830680291848193: no difference? end() will get cached anyway.
Line 96: Line 129:
== C++ move semantics/perfect forwarding == == Naming ==
Line 98: Line 131:
 * [[http://thbecker.net/articles/rvalue_references/section_01.html|C++ Rvalue References Explained]]
 * [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html#Move_Semantics|Rvalue Reference Quick Look]]
 * [[http://en.cppreference.com/w/cpp/utility/move|std::move - cppreference.com]]
 * [[https://www.ibm.com/developerworks/community/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/RVO_V_S_std_move?lang=en|RVO V.S. std::move (C/C++ Cafe)]]
 * [[http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html|Rvalue References and Move Semantics in C++11 - Cprogramming.com]]

== C++ and Python ==

[[https://github.com/pybind/pybind11|pybind/pybind11: Seamless operability between C++11 and Python]]

[[https://github.com/tbenthompson/cppimport|tbenthompson/cppimport: Import C++ files directly from Python!]]

== C stuff ==

Not C++, but this page is as good a place to put this as any.

 * [[http://blog.robertelder.org/7-weird-old-things-about-the-c-preprocessor/|7 Scandalous Weird Old Things About The C Preprocessor]]

== STL ==

Wrap an existing C-style pointer to an array with std::vector: http://stackoverflow.com/a/15203325/14878; modifies std::vector internals to work.

== C++11 ==

=== Smart pointers ===

 * [[https://arne-mertz.de/2015/12/shared_ptr-versus-unique_ptr-in-factory-functions/|shared_ptr Versus unique_ptr in Factory Functions]]
 * [[https://softwareengineering.stackexchange.com/questions/274801/raw-weak-ptr-unique-ptr-shared-ptr-etc-how-to-choose-them-wisely|c++ - raw, weak_ptr, unique_ptr, shared_ptr etc... How to choose them wisely? - Software Engineering Stack Exchange]]

== Stuff ==

 * [[https://github.com/fffaraz/awesome-cpp|awesome-cpp]]: A curated list of awesome C/C++ frameworks, libraries, resources, and shiny things. Inspired by awesome-... stuff.
 * [[https://www.conan.io/|Conan C/C++ Package Manager]]
 * "create" and "destroy" for heap-allocated (i.e. pointer) objects
 * "init" and "finish" for stack-allocated objects
Line 137: Line 139:

https://github.com/knusbaum/CPP-Dynamic-Class-Loading: Class for dynamically loading classes (Linux only)

See also:

C++ style guides

`const` correctness

Formatting

ClangFormat: auto-formats C++ code

Static analysis tools

  • Clang-Tidy: C/C++ linting tool, à la Google's cpplint.

clang-tidy -checks='*' *.cpp -- -std=c++11

# Highest severity warnings only (i.e. memory leaks, etc)
cppcheck --enable=all *.cpp
# Everything except style-related linting
cppcheck --enable=warning,performance,portability,information,missingInclude \
         --std=c++11 --library=std.cfg --verbose --quiet \
         *.cpp

Overview articles:

Thread safety analysis (TSA)

Documentation:

Example projects:

Lifetime safety analysis

Stuff I never remember

Unnecessary copies w/ `auto`

Beware unncessary copies w/ auto; default semantics is to make a copy.

// Typically there's no reason to copy.
for (const auto &Val : Container) { observe(Val); }
for (auto &Val : Container) { Val.change(); }

// Remove the reference if you really want a new copy.
for (auto Val : Container) { Val.change(); saveSomewhere(Val); }

// Copy pointers, but make it clear that they're pointers.
for (const auto *Ptr : Container) { observe(*Ptr); }
for (auto *Ptr : Container) { Ptr->change(); }

For iterating over maps:

// Nothing changed
for (const auto& [key, value]: some_map) { observ(value); }
for (auto& [key, value]: some_map) { value.change(); }

Don't evaluate `end()` in loops

// BAD
BasicBlock *BB = ...
for (BasicBlock::iterator I = BB->begin(); I != BB->end(); ++I)
  // ... use I ...

// GOOD (unless you are mutating BB; use the above loop if you are, and document you are doing so)
BasicBlock *BB = ...
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
  // ... use I ...

Notes:

Use `const` iterators if not mutating a structure

Expanding on the above:

BasicBlock *BB = ...
for (BasicBlock::const_iterator I = BB->cbegin(), E = BB->cend(); I != E; ++I)
  // ... use I ...

Naming

  • "create" and "destroy" for heap-allocated (i.e. pointer) objects
  • "init" and "finish" for stack-allocated objects

Dynamic loading of DLL/DSOs

Example of loading OpenCL dynamically. Uses a Python parser script to create special header file with defines that map both functions and does appropriate type conversion. https://github.com/opencv/opencv/pull/1542/files

Boost.DLL: Boost library for easily loading DLLs (e.g. for plugins). Cross platform, but requires runtime libraryes boost_system (integrated into C++11?) and boost_filesystem (integrated into C++17).

https://github.com/knusbaum/CPP-Dynamic-Class-Loading: Class for dynamically loading classes (Linux only)

SamatsWiki: CodingStyle/C++ (last edited 2020-09-02 20:49:51 by SamatJain)