If you wonder, why sizeof operator returns values bigger than you expect, you probably have to learn about compiler data structure alignment(as I had to:). Here I post a simple program demonstrating the case.
main.c
#include <stdio.h>
#include <string.h>
typedef struct
#ifdef PACKED
__attribute__ ((packed))
#endif
{
char *str; // 8
char ch ; // 1
int a; // 4
int b; // 4
int c; // 4
// Packed total size should be: 21
// Aligned total size should be: 24
} test_t;
static void print_sizes(test_t *t)
{
printf("DATA TYPE SIZES\n");
printf("char*: %ld\n", sizeof(char*));
printf("char: %ld\n", sizeof(char));
printf("int: %ld\n", sizeof(int));
printf("\nSIZE OF *t: %ld\n", sizeof(*t));
}
int main (int argc, char const* argv[]) {
test_t t;
t.str = "test string";
print_sizes(&t);
return 0;
}
makefile
ifeq ($(PACKED), true)
PACK=-DPACKED
else
PACK=
endif
ifdef OUT
OUTFILE=$(OUT)
else
OUTFILE=test
endif
CC=gcc
CFLAGS=-Wall -c $(PACK)
all: test
test: main.o
$(CC) main.o -o $(OUT)
main.o: main.c
$(CC) $(CFLAGS) main.c -o main.o
clean:
rm -f *.o *~
Compile versions with packed and padded memory:
$ make PACKED=true OUT=test_packed $ make OUT=test_padded
and test them:
$ ./test_packed DATA TYPE SIZES char*: 8 char: 1 int: 4 SIZE OF *t: 21 $ ./test_padded DATA TYPE SIZES char*: 8 char: 1 int: 4 SIZE OF *t: 24
So one should consider a space-time tradeoff for every particular program.
I'd be glad, if it helps someone.
No comments :
Post a Comment