C 38

malloc은 메모리를 할당하는 동안 더 많은 공간을 확보합니까?

malloc은 메모리를 할당하는 동안 더 많은 공간을 확보합니까? 테스트 프로그램에서 다음 동작을 관찰하고 있습니다. 하고 있습니다.malloc()1MB 정도의 용량을 제공됩니다.free()그후에sleep(10). 다섯 번 하고 있어요.메모리 소모량을 관찰하고 있습니다.top프로그램이 실행되는 동안. 한번만free()-d, 프로그램의 가상 메모리(VIRT) 사용량이 1MB 줄어들 것으로 예상하고 있습니다. 하지만 실제로는 그렇지 않습니다.안정적으로 유지됩니다.이러한 행동에 대한 설명은 무엇입니까?한다malloc()메모리를 할당하는 동안 약간의 예약을 합니까? 한번만free()-d, 프로그램의 가상 메모리(VIRT) 사용량이 1MB 줄어들 것으로 예상됩니다. 음, 이것은 C 표준으로는 보장되지 않습니다.한..

programing 2023.11.05

C 표준은 n개 요소 배열의 크기가 요소 크기의 n배가 되도록 요구합니까?

C 표준은 n개 요소 배열의 크기가 요소 크기의 n배가 되도록 요구합니까? C 표준은 n개 요소 배열의 크기가 요소 크기의 n배일 것을 명시적 진술에 의해 또는 요구 사항에서 엄격한 논리적 추론에 의해 요구합니까? 예를 들어, 할 수 있습니다.int (*x)[5] = malloc(5 * sizeof **x);5개의 배열을 위한 충분한 공간을 요청하지 못함int? C 2011 [N1570] 6.5.3.47은 다음과 같이 어레이의 엘리먼트 수를 계산하는 예를 보여줍니다.sizeof array / sizeof array[0]. 그러나 예는 표준의 규범적인 부분이 아닙니다(앞서 제8항에 따라). 6.2.520은 배열 유형이 특정 유형을 가진 연속적으로 할당된 비어 있지 않은 개체 집합을 설명하지만 필요한 총 메..

programing 2023.11.05

종료 시 파일 설명자를 닫는 것이 좋은 방법입니까?

종료 시 파일 설명자를 닫는 것이 좋은 방법입니까? 어떤 이유에서인지 프로그램에서 치명적인 상황이 발견되어 오류 코드를 가지고 종료하고 싶습니다.치명적인 오류의 맥락이 다른 파일 설명자의 범위를 벗어나는 경우도 있습니다.파일 설명자를 닫는 것이 좋은 방법입니까?이 파일들은 프로세스가 종료되면 자동으로 닫히는 것으로 알고 있습니다.POSIX 프로그래밍의 고전적인 가이드 "유닉스 환경에서의 고급 프로그래밍"은 다음과 같이 기술합니다. 프로세스가 종료되면 열린 모든 파일이 커널에 의해 자동으로 닫힙니다.많은 프로그램이 이 사실을 이용하고 열려 있는 파일을 명시적으로 닫지 않습니다. 질문에 OS를 언급하지 않았지만, 이러한 동작은 어느 OS에서나 예상할 수 있는 것입니다.프로그램 컨트롤 흐름이 교차할 때마다ex..

programing 2023.10.31

주어진 중단점에 도달할 때까지 GDB에서 실행되는 모든 행을 자동으로 인쇄하는 방법은 무엇입니까?

주어진 중단점에 도달할 때까지 GDB에서 실행되는 모든 행을 자동으로 인쇄하는 방법은 무엇입니까? 저는 GDB에서 중단점을 설정하고, 그 지점까지 실행할 수 있도록 하고 싶습니다. 그리고 그 과정에서 "스텝"한 선들을 출력합니다. 여기 예가 있습니다. 이 간단한 파일을 기반으로.main함수와 두 개의 중단점이 각각 다음과 같습니다. $ cat > test.c 19: raise ValueError() except (TypeError, ValueError): raise gdb.GdbError("speed argument must be an integer between 1 and 19, or 0") return speed class CmdAutoNext (gdb.Command): """Auto-Next thr..

programing 2023.10.31

프로세스에 대한 메모리 할당이 느리고 더 빠를 수 있는 이유는 무엇입니까?

프로세스에 대한 메모리 할당이 느리고 더 빠를 수 있는 이유는 무엇입니까? 저는 가상 메모리가 어떻게 작동하는지 비교적 잘 알고 있습니다.모든 프로세스 메모리는 페이지로 분할되며 가상 메모리의 모든 페이지는 실제 메모리의 페이지 또는 스왑 파일의 페이지에 매핑되거나 물리적 페이지가 여전히 할당되지 않은 새 페이지가 될 수 있습니다.OS는 애플리케이션이 메모리를 요구할 때가 아니라 새로운 페이지를 요구할 때 실제 메모리에 매핑합니다.malloc, 애플리케이션이 할당된 메모리에서 모든 페이지에 실제로 액세스할 때만 가능합니다.그래도 궁금한 게 있어요. 리눅스로 앱을 프로파일링할 때 이 사실을 알게 되었습니다.perf도구. 커널 기능에 걸리는 시간의 약 20%가 있습니다.clear_page_orig,__do_..

programing 2023.10.26

GCC는 가변 길이 배열을 어떻게 구현합니까?

GCC는 가변 길이 배열을 어떻게 구현합니까? GCC는 VLA(Variable-length Arrays)를 어떻게 구현합니까?이러한 어레이는 기본적으로 alloca에 의해 반환되는 것과 같이 동적으로 할당된 스토리지에 대한 포인터입니까? 제가 생각할 수 있는 또 다른 대안은 그러한 배열이 함수의 마지막 변수로 할당되어 컴파일 시간 동안 변수의 오프셋을 알 수 있다는 것입니다.그러나 두 번째 VLA의 오프셋은 컴파일 시간 동안 다시 알 수 없습니다.다음은 VLA 지원을 위해 일부 GCC 문서에서 가져온 다음 예제 라인에 대한 할당 코드(x86 - x64 코드가 유사함)입니다. char str[strlen (s1) + strlen (s2) + 1]; 에 대한 계산이 어디에strlen (s1) + strlen..

programing 2023.10.21

주 ()에 있는 주 ()를 c로 호출하기

주 ()에 있는 주 ()를 c로 호출하기 전화 가능한가요?main()내부에main()c에서 기능합니까?예, C를 사용하면 메인 함수를 호출할 수 있습니다(C++는 호출하지 않음)전화하는 것은 정말로 허용됩니다.main()다른 재귀적 코드에 사용되는 것과 동일한 방식으로 스택 오버플로를 피하더라도 다음과 같은 종료 조건이 적용됩니다. #include int main (int argc, char *argv[]) { printf ("Running main with argc = %d, last = '%s'\n", argc, argv[argc-1]); if (argc > 1) return main(argc - 1, argv); return 0; } 로 실행될 때testprog 1 2 3, 출력: Running m..

programing 2023.10.16

C 캐시 레벨 및 크기 결정을 위한 프로그램

C 캐시 레벨 및 크기 결정을 위한 프로그램 명확성을 위해 전체 다시 쓰기/업데이트(그리고 당신의 제정신, 그것은 너무 깁니다)... (Old Post) 과제를 위해서는 각 캐시의 레벨(L1,L2,...)과 크기를 찾아야 합니다.힌트와 지금까지 발견한 내용을 보면, 다양한 크기의 배열을 만들어 읽는 것이 아이디어라고 생각합니다.작업 타이밍: sizes = [1k, 4k, 256K, ...] foreach size in sizes create array of `size` start timer for i = 0 to n // just keep accessing array arr[(i * 16) % arr.length]++ // i * 16 supposed to modify every cache line ....

programing 2023.10.16

C 복합 리터럴, 배열 포인터

C 복합 리터럴, 배열 포인터 복합 리터럴을 변수에 할당하려고 하는데 작동하지 않는 것 같습니다. int *p[] = (int *[]) {{1,2,3},{4,5,6}}; gcc에서 오류가 났습니다. 이 글만 쓴다면, int p[] = (int []) {1,2,3,4,5,6}; 그럼 괜찮아요. 하지만 제가 원하는 것은 아닙니다. 오류가 발생하는 이유를 이해할 수 없습니다. 배열처럼 초기화하거나 문자 배열 포인터와 함께 사용해도 괜찮기 때문입니다. int *p[] = (int *[]) {{1,2,3},{4,5,6}}; //I got a error int p[][3] = {{1,2,3},{4,5,6}}; //it's okay char *p[] = (char *[]) {"one", "two"...}; // it..

programing 2023.09.26

C vs C++ 사이즈의

C vs C++ 사이즈의 이 질문에는 이미 다음과 같은 답변이 있습니다. 연산자의 크기가 c & c++에 대해 다른 값을 반환합니까? (2개 답변) 닫힘7년 전에. 방금 이 간단한 코드 조각을 발견했는데 왜 이 프로그램이 C 컴파일러에 의해 컴파일되었을 때 출력이 되는지 궁금합니다.4C++로 컴파일되면 다음과 같습니다.8. #include int x; int main(){ struct x {int a; int b;}; printf("%d", sizeof(x)); return 0; } C++ 출력이 합리적임 (8 = 4 + 4 = sizeof(x.a) + sizeof(x.b)), 하지만 C의 출력은 그렇지 않습니다.그럼 어떻게?sizeofC에서 일한다고요? C : https://ideone.com/zj5Q..

programing 2023.09.26