반응형

C 117

브레인포크 인터프리터 최적화

브레인포크 인터프리터 최적화 통역사와 최적화에 대해 배우는 데 도움이 되는 연습으로, 저는 C에서 브레인포크 통역사를 썼습니다.아직까지는 완벽하게 작동하는 것처럼 보이지만, 다른 빠른 인터프리터에 비해 실행 속도에서 경쟁이 잘 되지 않습니다. 이 인터프리터를 변경하여 성능을 향상시킬 수 있는 방법은 무엇입니까? 제 인터프리터의 한 가지 흥미로운 측면은 (대부분의 다른 사람들도 아마 이것을 할 것이지만) 소스 입력을 읽고 각 명령을 하나의 루프로 변환하는 것입니다. struct { long instruction; long loop; } 그loopvalue는 일치하는 항목의 인덱스입니다.]명령어, 명령어가 a인 경우[, 그리고 일치하는 색인.[명령어, 명령어가 a인 경우], 재빠르게 점프할 수 있는이 '파싱..

sourcecode 2023.11.05

사용되지 않는 명령줄 인수 오류를 비활성화하지 않고 clang으로 침묵시키는 방법은 무엇입니까?

사용되지 않는 명령줄 인수 오류를 비활성화하지 않고 clang으로 침묵시키는 방법은 무엇입니까? 사용시-Werrorclang을 사용하면 "경고: 컴파일 중에 사용되지 않은 인수" 메시지를 오류로 변환하는데, 이는 일리가 있습니다.뭐가 있어요.-Qunused-arguments그들을 완전히 잠재우려고 깃발을 올렸습니다.제 질문은, 어떤 것들이-Wno-error=...이를 완전히 비활성화하지 않고 오류가 되지 않도록 하기 위해 전달할 수 있는 플래그?알고 보니 정답은-Wno-error=unused-command-line-argument.다음 명령을 사용할 수도 있습니다. -Wno-unused-command-line-argument 저의 경우 ./configure에서 clang-8 컴파일러를 사용하면서 auto..

sourcecode 2023.11.05

콘솔에서 프로그램이 실행되는지 확인하는 방법은 무엇입니까?

콘솔에서 프로그램이 실행되는지 확인하는 방법은 무엇입니까? 진단서를 표준 출력에 덤핑하는 애플리케이션을 쓰고 있습니다. 애플리케이션을 다음과 같은 방식으로 작동시키고 싶습니다. 독립 실행형 명령 프롬프트에서 실행되는 경우(를 통해)cmd.exe) 또는 표준 출력을 파일로 리디렉션/파이프 처리하여 완료되는 즉시 깨끗하게 종료합니다. 그렇지 않으면(창에서 실행되고 콘솔 창이 자동으로 생성되는 경우) 창이 사라지기 전에 종료하기 전에 키를 누를 때까지 기다립니다(사용자가 진단을 읽을 수 있도록) 어떻게 그 구별을 할 수 있을까요?부모 프로세스를 검토하는 것이 방법이 될 수 있다고 생각하지만 저는 WinAPI에 관심이 없어서 의문입니다. 저는 MinGW GCC입니다.및 메서드를 사용할 수 있습니다. 먼저 콘솔 ..

sourcecode 2023.10.26

휘발성 구조의 부재를 분리하기 위한 쓰기 순서는 보존이 보장됩니까?

휘발성 구조의 부재를 분리하기 위한 쓰기 순서는 보존이 보장됩니까? 내가 다음과 같은 구조를 가지고 있다고 가정합니다. volatile struct { int foo; int bar; } data; data.foo = 1; data.bar = 2; data.foo = 3; data.bar = 4; 과제는 전부 순서가 변경되지 않도록 보장이 되어 있습니까? 예를 들어 휘발성이 없는 경우 컴파일러는 다음과 같이 다른 순서로 두 개의 명령어로 최적화할 수 있습니다. data.bar = 4; data.foo = 3; 하지만 휘발성이 있는 상황에서 컴파일러는 이런 일을 하지 말아야 할까요? data.foo = 1; data.foo = 3; data.bar = 2; data.bar = 4; (예를 들어 멤버를 서로..

sourcecode 2023.10.21

C 프로그래밍: pthread를 사용한 디버깅

C 프로그래밍: pthread를 사용한 디버깅 제가 처음에 적응하기 어려웠던 것 중 하나는 C에서 pthread를 사용한 집중적인 경험 프로그램이었습니다.저는 실행될 다음 코드 라인이 무엇인지 정확히 알고 있었고 대부분의 디버깅 기법은 그 기대에 중점을 두고 있었습니다. C에서 pthread로 디버깅할 수 있는 좋은 기술은 무엇입니까?추가 도구나 사용하는 도구 또는 디버깅에 도움이 되는 다른 도구 없이 개인 방법론을 제안할 수 있습니다. 추신: 저는 리눅스에서 gcc를 사용하여 C 프로그래밍을 하지만, 그것이 반드시 당신의 답변을 방해하지 않도록 합니다.Valgrind는 인종 조건과 pthread API 오용을 찾아내는 데 탁월한 도구입니다.프로그램 메모리 모델(및 공유 리소스) 액세스를 유지하며 버그가..

sourcecode 2023.10.21

간단한 리눅스 신호 처리

간단한 리눅스 신호 처리 가 를 .kill또는 프로세스를 종료할 수 있습니다. 여기 코드와 메인()의 모양이 있습니다. static int terminate = 0; // does this need to be volatile? static void sighandler(int signum) { terminate = 1; } int main() { signal(SIGINT, sighandler); // ... // create objects, spawn threads + allocate dynamic memory // ... while (!terminate) sleep(2); // ... // clean up memory, close threads, etc. // ... signal(SIGINT, SIG_D..

sourcecode 2023.10.16

프로세스 리눅스(C 코드)에 대한 열린 파일 설명자 찾기?

프로세스 리눅스(C 코드)에 대한 열린 파일 설명자 찾기? 리눅스에서 프로세스를 위해 열려있는 모든 fds를 찾고 싶었습니다. glib 라이브러리 기능으로 할 수 있습니까?여기 제가 예전에 사용했던 코드가 있습니다. /proc/self(thxDonal!)에 대해서는 몰랐지만, 어쨌든 이 방법이 더 일반적일 것입니다.맨 위에 모든 기능에 필요한 내용을 포함시켰습니다. #include #include #include #include #include #include #include #ifndef FALSE #define FALSE (0) #endif #ifndef TRUE #define TRUE (!FALSE) #endif /* implementation of Donal Fellows method */ int..

sourcecode 2023.10.16

보이드로 변환하거나 그 반대로 변환하는 것은 무엇을 의미합니까?

보이드로 변환하거나 그 반대로 변환하는 것은 무엇을 의미합니까? 을 로합니까 합니까?void*아니면 기억의 관점에서 봤을 때 그 반대?가 알기로는 void*는 지정되지 않은 길이의 메모리 블록에 대한 주소입니다. 이것은 사과와 오렌지를 비교하는 것 같습니다. int myval = 5; void* ptr = (void*)myval; printf("%d",(int)ptr); 저는 이것이 사용되는 정확한 맥락을 제시했어야 한다는 것을 깨달았습니다. int main(int argc, char* argv[]) { long thread; /* Use long in case of a 64-bit system */ pthread_t* thread_handles; /* Get number of threads from c..

sourcecode 2023.10.06

컴파일러 최적화 bitwise not operation

컴파일러 최적화 bitwise not operation 저는 두 배열이 서로 반대인지 간단한 기능 테스트를 하고 있습니다.그들은 겉보기엔 동일하지만, 다만 a를 제외하고는.tmp변수.한 명은 일을 하고 다른 한 명은 그렇지 않습니다.컴파일러가 이 문제를 최적화하는 이유를 평생 이해할 수 없습니다. 만약 정말로 최적화 문제라면(제 컴파일러는 IAR Workbench v4.30.1입니다.).제 암호는 이렇습니다. // this works as expected uint8 verifyInverseBuffer(uint8 *buf, uint8 *bufi, uint32 len) { uint8 tmp; for (uint32 i = 0; i < len; i++) { tmp = ~bufi[i]; if (buf[i] != ..

sourcecode 2023.10.06

고정된 크기의 배열에 대한 포인터 배열

고정된 크기의 배열에 대한 포인터 배열 고정된 크기의 배열 두 개를 포인터 배열에 할당하려고 했지만 컴파일러가 경고했고 그 이유를 이해할 수 없습니다. int A[5][5]; int B[5][5]; int*** C = {&A, &B}; 이 코드는 다음 경고와 함께 컴파일됩니다. 경고: 호환되지 않는 포인터 유형에서 초기화 [기본적으로 활성화] 코드를 실행하면 세그멘테이션 오류가 발생합니다.하지만 동적으로 할당하면A그리고.B, 그것은 잘 작동합니다.이게 왜죠? ,C다 것입니다.A그리고.B이렇게 해야 합니다. int A[5][5]; int B[5][5]; int (*C[])[5][5] = {&A, &B}; 의 입니다.C"는 배열에 대한 포인터의 배열입니다."C로 읽힙니다.전체 배열을 할당할 수 없으므로 배열..

sourcecode 2023.10.01
반응형