A note on empty destructors

Note that writing an empty destructor prevents the compiler from implementing certain optimizations. As you can see in the following table, copying an array of a trivial class with an empty destructor yields the same, non-optimized, assembler code as copying with a handcrafted for loop:

Empty destructor and std::copy

Copy by handwritten for-loop

struct Point { int x, y; ~Point(){}};auto copy(Point* src, Point* dst) { std::copy(src, src+64, dst);}
struct Point {  int x, y;};auto copy(Point* src, Point* dst) {  const auto end = src + 64;  for(; src != end; ++src, ++dst) {    *dst = *src;  }}

This generates the following x86 assembler:

 xor eax, eax.L2: mov rdx, QWORD PTR [rdi+rax] mov QWORD PTR [rsi+rax], ...

Get C++ High Performance now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.