我怀疑这是一个愚蠢的问题。但我无法得到答案。假设我们有一段记忆:
void *mem = malloc(32);
假设您想创建一些东西,例如:
int *ptr;
这样这个东西就位于 address&mem
,就像在工会中发生的那样。
目标是尝试实现一个小的malloc。
这是现有测试代码的示例,其中在数组外部创建了一个新指针(而不是应有的样子)(只是不要发誓,不要smack):
int main(void){
void *mem,*mpt;
if( (mpt=mem=malloc(32)) == NULL )
puts("Allocation error!"),abort();
unsigned long *ctm;
ctm=mpt;
mpt+=sizeof(ctm);
*ctm=13;
printf("mem [%p] %p \n", &mem, mem );
printf("mpt [%p] %p \n", &mpt, mpt );
printf("ctm [%p] %p %lu \n", &ctm, ctm,*ctm);
return 0;}
我收集所以:cc -Werror -o Test Test.c -std=c11
显然,带有装配插件的变体不适合,因为 需要为不同架构的组装保留多功能性。
如果您通过调用为新对象分配内存
那么这个新对象将位于该地址
mem
,而不是该地址&mem
。&mem
这里绝对没有。C 语言不支持
void *
指针的地址算术。要执行字节地址算术,必须将指针转换为 typechar *
。在为该类型的对象分配内存后
unsigned long
,您需要将指针移至sizeof(unsigned long)
,也就是说sizeof *ctm
,而不是sizeof ctm
那不是
一个
否则,一切都会正确完成。但是,一般来说,如果您谈论的是“不同架构的程序集”,则不应忘记对齐要求。
您在评论中的其余问题中所谈论的内容并不完全清楚。C 语言不允许在特定地址声明变量。在显式声明的数组(从迂腐的角度来看,这并不完全合法)中的内存本地分配可以按照您在上面所做的相同方式进行组织。数组是通过分配
malloc
还是显式声明 - 无关紧要。同样,请记住对齐要求。如果你想实现一个小
malloc()
的,那么我认为这没有障碍。但是,重要的是要记住,本机
malloc()
非常复杂。此外,该设备因编译器、运行时库和操作系统而异。在内部,本机
malloc()
通常调用操作系统,向它请求内存,通常在整个页面中并有一些余量。因此,许多小型的malloc()
通常工作得很快。malloc()
您可以使用针对特定使用策略优化的各种现有实现。可以制作一种快速且经济
malloc()
的适用于堆栈内存的产品。这通常在资源非常有限的系统中完成,例如,在对控制器进行编程时,无论它们是工业系统、嵌入式设备还是游戏机,例如NES
(alaDendy
)。有一个函数
_alloca()
(或alloca()
)。这是一个类似物malloc()
,它不是从堆中分配内存,而是从线程的堆栈中分配内存。不建议使用此函数,因为有许多难以理解的细微之处和警告,尤其是在深层调用堆栈中,尤其是在使用宏时。但如果你真的想,那么你可以。