You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			42 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
			
		
		
	
	
			42 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
#include <stdio.h>
 | 
						|
 | 
						|
//There are two factors at play for why our struct is taking up 12 bytes of memory
 | 
						|
//1. C and C++ require that the members of a structure are allocated in declaration order
 | 
						|
// This means that the address in memory for first must be less than second and second less than third
 | 
						|
 | 
						|
//2. Processors either require or prefer that types are alligned in memory such that they begin on an
 | 
						|
//address boundry that is some multiple of it's size so if second was placed after first it would be 
 | 
						|
//misaligned 
 | 
						|
 | 
						|
//So what we are seeing here is that the second member is padded so that it is ensured to falls on a 
 | 
						|
//on a 4 byte boundry relative to the start of the structure
 | 
						|
 | 
						|
//typedef struct
 | 
						|
//{
 | 
						|
//	
 | 
						|
//	short first; //xx__
 | 
						|
//	int second; //xxxx
 | 
						|
//	short third; //xx__ //this end is padded to ensure that if multiple structures were in an array that they would also be aligned
 | 
						|
//} Layout;
 | 
						|
 | 
						|
//reordering can help align memory and reduce memory usage
 | 
						|
// This results in an 8 byte struct
 | 
						|
typedef struct
 | 
						|
{	
 | 
						|
	short first; //xx
 | 
						|
	short third; //xx
 | 
						|
	int second; //xxxx
 | 
						|
} Layout;
 | 
						|
 | 
						|
 | 
						|
int main()
 | 
						|
{
 | 
						|
	printf("short: (%d) bytes\n", (int) sizeof(short));
 | 
						|
 | 
						|
	printf("int: (%d) bytes\n", (int) sizeof(int));
 | 
						|
 | 
						|
	//What is interesting is that the struct as a whole occupies 12 bytes not 8 like we thought
 | 
						|
	printf("struct: (%d) bytes\n", (int) sizeof(Layout));
 | 
						|
 | 
						|
	return 0;
 | 
						|
} |