Загружаем каталог…
Загружаем каталог…
malloc 예시: 주차장에서 자동차를 주차하는 발렛 요원의 업무 알고리즘 필요해보이는 개념: 청크, 페이지, OS 간에 상호작용 malloc 에 대한 현재 내 생각 문제의식: 컴파일 타임에 증명할 수 없는 데이터를 담기 위한 그릇이 필요하다. 현실은 아마도 카오스 세계일 것이기에 런타임의 데이터를 100% 예측할 수 없을 것이고, 단 하나의 완벽한 malloc 함수는 없을 것이다. 그래서 수십 년동안 IT 에서 이 난제를 풀기 위해 고민해왔다. 불확실한 상황에서 하드웨어 리소스를 어떻게 사용할 것인가? 메모리 활용도 높이기 (트레이드오프: Latency) 처리 속도 높이기 (트레이드오프: Fragmentation) 당연히 다양한 맥락이 있을 것이고, 특정한 맥락이 조금씩 바뀔지라도, 경향성이 패턴으로 포착되는 한, 나름의 적당한 해법(특정한 malloc 알고리즘)이 있을 것이다. 의문: malloc() 은 왜 void* 를 return 하는가? 할당해준 메모리에 호출자가 어떤 타입의 데이터를 담을지 미리 알 수 없기 때문 malloc() 입장에서 타입을 몰라도 모든 타입에 대해 범용적으로 메모리를 할당 만약 C언어에서 void*가 없었다면, 타입마다 함수를 따로 만들어야 했을 것임 malloc_int() malloc_char() malloc_struct_node() 등등... C언어 규칙상 void* 는 어떤 포인터 타입으로든 명시적인 캐스팅 없이 암묵적으로 형변환된다 (Implicit Conversion). 반환값을 임의의 특정 포인터 변수에 그대로 대입할 수 있다. int *arr = malloc(sizeof(int) * 10); char *str = malloc(sizeof(char) * 32); struct Node *node = malloc(sizeof(struct Node)); malloc() 은 타입 정보가 없기에 데이터 해석 규칙이나 크기 정보를 모른다. 순수하게 물리적 메모리 시작 위치만 건네준다. 특정 포인터의 타입은 컴파일러에게 "이 주소에서 몇 바이트를 읽어야 하는가", "포인터 연산(p + 1) 시 몇 바이트를 건너뛰어야 하는가" 를 알려준다. int *p; -> p + 1 은 4바이트 이동 double *p; -> p + 1 은 8바이트 이동 void *p; -> 가리키는 대상의 크기 정보가 없음 결론: 성공해서 정상적인 주소를 주든, 실패해서 NULL을 주든, 기계어 관점에서는 8바이트 주소 레지스터(%rax)를 쓰는 void * 타입 포인터를 반환하는 것은 고정이다.
То, что RADAR обнаружил и классифицировал для этой возможности. Это опубликованный источником текст, а не подтверждение, что предложение ещё действует.
malloc() 의 문제의식은 뭐였을까? malloc() 은 왜 포인터가 필요할까? malloc() 은 왜 void* 를 return 하는가?. malloc 예시: 주차장에서 자동차를 주차하는 발렛 요원의 업무 알고리즘 필요해보이는 개념: 청크, 페이지, OS 간에 상호작용 malloc 에 대한 현재 내 생각 문제의식: 컴파일 타임에 증명할 수 없는 데이터를 담기 위한 그릇이 필요하다. 현실은 아마도 카오스 세계일 것이기에 런타임의 데이터를 100% 예측할 수 없을 것이고, 단 하나의 완벽한 malloc 함수는 없을 것이다. 그래서 수십 년동안 IT 에서 이 난제를 풀기 위해 고민해왔다. 불확실한 상황에서 하드웨어 리소스를 어떻게 사용할 것인가? 메모리 활용도 높이기 (트레이드오프: Latency) 처리…