pmg*_*pmg 10
> type ppp.c
#include <stdio.h>
#include <stdlib.h>
int global = 0;
int main(void) {
int local = 0;
static int staticint = 0;
int *mall;
int (*fx)(void);
fx = main;
mall = malloc(42); /* assume it worked */
printf("#sizeof pointer to local: %d\n", (int)sizeof &local);
printf("#sizeof pointer to static: %d\n", (int)sizeof &staticint);
printf("#sizeof pointer to malloc'd: %d\n", (int)sizeof mall);
printf("#sizeof pointer to global: %d\n", (int)sizeof &global);
printf("#sizeof pointer to main(): %d\n", (int)sizeof fx);
free(mall);
return 0;
}
> tcc -mc ppp.c
Turbo C Version 2.01 ...
warnings about unused variables elided ...
Turbo Link Version 2.0 ...
> ppp
#sizeof pointer to local: 4
#sizeof pointer to static: 4
#sizeof pointer to malloc'd: 4
#sizeof pointer to global: 4
#sizeof pointer to main(): 2
> tcc -mm ppp.c
> ppp
#sizeof pointer to local: 2
#sizeof pointer to static: 2
#sizeof pointer to malloc'd: 2
#sizeof pointer to global: 2
#sizeof pointer to main(): 4
Run Code Online (Sandbox Code Playgroud)
tcc -mc在"紧凑"模型中生成代码; tcc -mm在"中"模型中生成代码
在实模式x86上,代码和数据由段+偏移量访问,每个都是16位数量."近"指针仅为16位且使用当前段,"远"指针为32位并指定段和偏移量.对于C编译器,您可以选择几种不同的内存模型,具有代码和数据的近端或远端指针的不同默认值.
例如,"中"存储器模型在数据指针附近使用,但默认情况下用于代码的远指针.
如果一些现代嵌入式处理器具有类似的内存模型,我不会感到惊讶.
请注意,POSIX需要指向对象的指针和指向函数的指针大小相同:
2.12.3指针类型
所有函数指针类型应与void指向的类型指针具有相同的表示形式.将函数指针转换为void*不得改变表示.这种转换产生的void*值可以使用显式转换转换回原始函数指针类型,而不会丢失信息.
注意:ISO C标准不要求这样,但它是POSIX一致性所必需的.
因此,声称符合POSIX标准的系统将是统一的.如果您只针对此类计算机,那么您不必担心这些差异.
16位PIC单片机(Microchip PIC24和dsPIC)是具有不同数据和代码空间指针大小的哈佛架构器件的示例.单独的地址空间大小不同 - 片上SRAM的芯片面积成本比Flash存储器要大得多,因此数据指针可以更小.
PIC12,PIC16和PIC18架构也是如此,但dsPIC是我目前正在使用的.
| 归档时间: |
|
| 查看次数: |
7923 次 |
| 最近记录: |