構造與析構:
#include <stdio.h>
#include <stdlib.h>
static __attribute__((constructor)) void before()
{
printf("Hello");
}
static __attribute__((destructor)) void after()
{
printf(" World!\n");
}
int main(int args,char ** argv)
{
printf("main");
return EXIT_SUCCESS;
}
~
[root@workstation2017 ~]# ./test.out
Hellomain World!
優先級:
[root@workstation2017 ~]# vi test.c
#include <stdio.h>
#include <stdlib.h>
static __attribute__((constructor(101))) void begin101()
{
printf("Hello-101\n");
}
static __attribute__((constructor(102))) void begin102()
{
printf("Hello-102\n");
}
static __attribute__((destructor(150))) void end101()
{
printf(" World!-101\n");
}
static __attribute__((destructor(151))) void end102()
{
printf(" World!-102\n");
}
int main(int args,char ** argv)
{
return EXIT_SUCCESS;
}
[root@workstation2017 ~]# ./test.out
Hello-101
Hello-102
World!-102
World!-101
對齊屬性:
__attrubte__ ((packed)) 的作用就是告訴編譯器取消結構在編譯過程中的優化對齊,按照實際占用位元組數進行對齊
[root@workstation2017 ~]# vi test.c
#include <stdio.h>
#include <stdlib.h>
#define __u8 unsigned char
#define __u16 unsigned short
struct str_struct{
__u8 a;
__u8 b;
__u8 c;
__u16 d;
} __attribute__ ((packed));
typedef struct {
__u8 a;
__u8 b;
__u8 c;
__u16 d;
} __attribute__ ((packed)) str;
typedef struct {
__u8 a;
__u8 b;
__u8 c;
__u16 d;
}str_temp __attribute__ ((packed));
typedef struct {
__u8 a;
__u8 b;
__u8 c;
__u16 d;
}str_nopacked;
int main(void)
{
printf("sizeof str = %d\n", sizeof(str));
printf("sizeof str_struct = %d\n", sizeof(struct str_struct));
printf("sizeof str_temp = %d\n", sizeof(str_temp));
printf("sizeof str_nopacked = %d\n", sizeof(str_nopacked));
return 0;
}
[root@workstation2017 ~]# ./test.xx
sizeof str = 5
sizeof str_struct = 5
sizeof str_temp = 6
sizeof str_nopacked = 6
變量占記憶體大小 x64 x32差别:
變量的長度,在不同的系統之間會有差别,64位Linux系統和32位Linux系統中,幾種常見C語言變 量的長度:
short int long long long ptr time_t
32位 2 4 4 8 4 4
64位 2 4 8 8 8 8