Programmatically find the number of cores on a machine

C++11 #include <thread> //may return 0 when not able to detect const auto processor_count = std::thread::hardware_concurrency(); Reference: std::thread::hardware_concurrency In C++ prior to C++11, there’s no portable way. Instead, you’ll need to use one or more of the following methods (guarded by appropriate #ifdef lines): Win32 SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); int numCPU = sysinfo.dwNumberOfProcessors; Linux, Solaris, AIX … Read more

What are the main purposes of using std::forward and which problems it solves?

You have to understand the forwarding problem. You can read the entire problem in detail, but I’ll summarize. Basically, given the expression E(a, b, … , c), we want the expression f(a, b, … , c) to be equivalent. In C++03, this is impossible. There are many attempts, but they all fail in some regard. … Read more

Why have header files and .cpp files? [closed]

C++ compilation A compilation in C++ is done in 2 major phases: The first is the compilation of “source” text files into binary “object” files: The CPP file is the compiled file and is compiled without any knowledge about the other CPP files (or even libraries), unless fed to it through raw declaration or header … Read more

Typedef function pointer?

typedef is a language construct that associates a name to a type. You use it the same way you would use the original type, for instance typedef int myinteger; typedef char *mystring; typedef void (*myfunc)(); using them like myinteger i; // is equivalent to int i; mystring s; // is the same as char *s; … Read more

GCC -fPIC option

Position Independent Code means that the generated machine code is not dependent on being located at a specific address in order to work. E.g. jumps would be generated as relative rather than absolute. Pseudo-assembly: PIC: This would work whether the code was at address 100 or 1000 100: COMPARE REG1, REG2 101: JUMP_IF_EQUAL CURRENT+10 … … Read more

Debug vs Release in CMake

With CMake, it’s generally recommended to do an “out of source” build. Create your CMakeLists.txt in the root of your project. Then from the root of your project: mkdir Release cd Release cmake -DCMAKE_BUILD_TYPE=Release .. make And for Debug (again from the root of your project): mkdir Debug cd Debug cmake -DCMAKE_BUILD_TYPE=Debug .. make Release … Read more

unsigned int vs. size_t

The size_t type is the unsigned integer type that is the result of the sizeof operator (and the offsetof operator), so it is guaranteed to be big enough to contain the size of the biggest object your system can handle (e.g., a static array of 8Gb). The size_t type may be bigger than, equal to, … Read more

What are the advantages of list initialization (using curly braces)?

Basically copying and pasting from Bjarne Stroustrup’s “The C++ Programming Language 4th Edition”: List initialization does not allow narrowing (§iso.8.5.4). That is: An integer cannot be converted to another integer that cannot hold its value. For example, char to int is allowed, but not int to char. A floating-point value cannot be converted to another … Read more