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], ...