스택과 힙에 무언가가 있는지 어떻게 알 수 있습니까? [복제]

Nov 27 2020

Rust에는 다양한 유형이 있습니다. 스택과 힙에 무언가가 있는지 어떻게 알 수 있습니까?

20 레벨 깊이의 중첩 구조체가 있고 모든 레벨에 스택 데이터가 있지만 레벨 20에 하나의 힙 상자가 있다면 전체 트리가 이제 힙에 있음을 의미합니까?

그리고 루트에서 구조체가 힙의 Box 안에 있으면 모든 스택 기반 데이터가 이제 힙으로 이동합니까?

이 스택과 힙 논리를 관찰하는 도구가 있습니까?

답변

3 Masklinn Nov 27 2020 at 20:42

Rust에는 다양한 유형이 있습니다. 스택과 힙에 무언가가 있는지 어떻게 알 수 있습니까?

아무도 힙에 넣지 않으면 힙에 있지 않습니다.

20 레벨 깊이의 중첩 구조체가 있고 모든 레벨에 스택 데이터가 있지만 레벨 20에 하나의 힙 상자가 있다면 전체 트리가 이제 힙에 있음을 의미합니까?

아니요 Box. 특히 힙 포인터입니다. 따라서 상자 안에있는 모든 것은 힙에 있습니다. 나머지는 어디에 두든 상관 없습니다 (트리 자체가 상자에있을 수 있으며,이 지점에서 다른 힙 할당 구조를 가리키는 힙 할당 구조를 갖게됩니다).

다른 일반적인 힙 포인터는 Rc, Arc, String, 또는 Vec. 물론 포인터가되지 않고 힙에서 작업을 수행하는 더 복잡한 구조가 HashMap있습니다.

그리고 루트에서 구조체가 힙의 Box 안에 있으면 모든 스택 기반 데이터가 이제 힙으로 이동합니까?

예. 나머지 구조는 "루트"의 "내부"이므로 전체를 상자에 넣습니다.

이 스택과 힙 논리를 관찰하는 도구가 있습니까?

별로. 할당 자 추적 또는 일부 할당 자에서 디버깅 지원 (예 : jemalloc의 힙 프로파일 링)과 같은 도구가있어 힙 할당을 추적 할 수 있습니다. 그러나이 모든 것은 정확히 어떤 바이트가 할당 된 것이 아니라 어느 정도의 바이트가 할당되었음을 알 수 있으며, 힙 할당이 발생하지 않았다는 공제에 의해 힙 할당이 발생하지 않았다는 것만 알 수 있습니다.

2 PeterHall Nov 27 2020 at 21:07

리눅스에서, 당신은 힙 사용을 프로파일 링 할 수 있습니다 valgrindmassif와 함께 결과를 볼 ms_print.

먼저 프로그램 프로파일 링 :

$ valgrind --tool=massif ./target/debug/my_program 
==32006== Massif, a heap profiler
==32006== Copyright (C) 2003-2017, and GNU GPL'd, by Nicholas Nethercote
==32006== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==32006== Command: ./target/debug/my_program
==32006==

보고서는로 볼 수있는 파일 massif.out.<pid>(여기서는 pid프로세스 ID)에 기록됩니다 ms_print. 위의 예에서 프로세스 ID는 32006이므로 다음과 같이 봅니다.

$ ms_print massif.out.32006

많은 정보를 얻을 수 있지만 힙 할당이 발생하는 위치를 알려줄 것입니다.