Is C++ memory alignment correct or inefficient?

alignment, c++, memory

Solution

It has nothing to do with alignment -- it's extra overhead of how the internal memory allocator works. Typically, each memory block has extra hidden information in it at the front and/or back used for maintaining the heap's structure. Exactly how much overhead there is is will vary from platform to platform and from implementation to implementation.

For example, Doug Lea's `malloc` has an extra overhead of 4-8 bytes per allocation (32-bit pointers) or 8-16 bytes (64-bit pointers) and a minimum allocation size of 16 bytes (32-bit) or 32 bytes (64-bit). That means for even 1-byte allocations, the memory allocator requires a total of 16 bytes of tracking overhead.

Problem

I tested this code just trying to find out how much memory c++ actually reserved for the new operator. ``` #include<iostream> using namespace std; int main() { cout << "alignment of " << alignof(int) << endl; int *intP1 = new int; *intP1 = 100; cout << "address of intP1 " << intP1 << endl; int *intP2 = new int; *intP2 = 999; cout << "address of intP2 " << intP2 << endl; int *intP3 = new int; cout << "address of intP3 " << intP3 << endl; *intP3 = 333; cout << endl; cout << (reinterpret_cast<char *>(intP3)-reinterpret_cast<char *>(intP2)) << endl; cout << intP3-intP2 << endl; cout << endl; cout << *(intP1) << endl; cout << *(intP1+4) << endl; cout << *(intP1+8) << endl; cout << *(intP1+16) << endl; delete intP1; delete intP2; delete intP3; return 0; } ``` After compiled the code with -std=c++11 flag and ran it, here is what I got from a x86_64 machine. ``` alignment of int4 address of intP1 = 0xa59010 address of intP2 = 0xa59030 address of intP3 = 0xa59050 the distance of intP3 and intP2 = 32 intP1 value = 100 is this a padding value = 0 intP2 value = 999 intP3 value = 333 ``` It seems that when using new to allocate a 4 bytes memory for an integer, it actually reserved 32 bytes block which is the total space for 8 integers. According to the explanation of the c++ alignment, for 64 bit machine, memory is aligned on 16 bytes, why the distance here is 32 bytes? Could some one help me to sort this out? Thanks in advance.

Original source

Related problems