728x90
반응형

C 16

[C++] sizeof (x ++)가 x를 증가시키지 않을 때

질문 : sizeof (x ++)가 x를 증가시키지 않는 이유는 무엇입니까? 다음은 dev C ++ 창에서 컴파일 된 코드입니다. #include int main() { int x = 5; printf("%d and ", sizeof(x++)); // note 1 printf("%d\n", x); // note 2 return 0; } 노트 1 을 실행 한 후 x 가 6이 될 것으로 예상합니다. 그러나 출력은 다음과 같습니다. 4 and 5 x 가 노트 1 이후에 증가하지 않는 이유를 누구든지 설명 할 수 있습니까? 답변 C99 표준에서 (강조는 내 것임). 6.5.3.4/2 sizeof 연산자는 피연산자의 크기 (바이트 단위)를 산출하며, 표현식 또는 유형의 괄호로 묶인 이름 일 수 있습니다. 크기는 ..

개발관련/other 2022.03.29

프로젝트 오일러와의 속도 비교 : C vs Python vs Erlang vs Haskell

질문 : 프로젝트 오일러와의 속도 비교 : C vs Python vs Erlang vs Haskell 저는 Project Euler 에서 문제 # 12 를 프로그래밍 연습으로 가져와 C, Python, Erlang 및 Haskell의 내 (최적은 아님) 구현을 비교했습니다. 더 높은 실행 시간을 얻기 위해 원래 문제에서 설명한 것처럼 500 대신 1000 이상의 제수가있는 첫 번째 삼각형 숫자를 검색합니다. 결과는 다음과 같습니다. C: lorenzo@enzo:~/erlang$ gcc -lm -o euler12.bin euler12.c lorenzo@enzo:~/erlang$ time ./euler12.bin 842161320 real 0m11.074s user 0m11.070s sys 0m0.000s ..

잘 작성된 C 코드보다 어셈블리가 더 빠른 경우의 예

질문 : 조립이 C보다 빠른 때는 언제입니까? 어셈블러를 아는 이유 중 하나는 때때로 더 높은 수준의 언어, 특히 C로 코드를 작성하는 것보다 더 성능이 좋은 코드를 작성하는 데 사용될 수 있다는 것입니다. 그러나 전적으로 잘못된 것은 아니지만 어셈블러를 실제로 사용하여 더 많은 성능의 코드를 생성 할 수있는 경우는 극히 드물고 어셈블리에 대한 전문 지식과 경험이 필요하다고 여러 번 언급 한 적이 있습니다. 이 질문은 어셈블러 명령어가 기계별로 다르고 이식 불가능하다는 사실이나 어셈블러의 다른 측면에 대해서도 설명하지 않습니다. 물론이 외에도 어셈블리를 아는 데는 많은 이유가 있지만, 이것은 어셈블러 대 상위 수준 언어에 대한 확장 된 담론이 아니라 예제와 데이터를 요청하는 특정 질문을 의미합니다. 누구..

개발관련/other 2021.11.10

C++ 에서 bool에 대한 printf 포맷 지정자

질문 : bool에 대한 printf 형식 지정자는 무엇입니까? ANSI C99부터 stdbool.h 를 통해 _Bool 또는 bool 있습니다. 그러나 printf 형식 지정자가 있습니까? 나는 그 의사 코드와 같은 것을 의미합니다. bool x = true; printf("%B\n", x); 다음과 같이 인쇄됩니다. true 답변 bool 유형에 대한 형식 지정자는 없습니다. 보다 짧은 모든 정수 계열 형식 때문에, int 로 승격됩니다 int 에 아래로 통과 할 때 printf() 의 가변 인수를 사용할 수 %d : bool x = true; printf("%d\n", x); // prints 1 그러나 왜 안 되는가 : printf(x ? "true" : "false"); 또는 더 나은 : pri..

Python에서 C / C ++ 호출

질문 : Python에서 C / C ++ 호출? C 또는 C ++ 라이브러리에 대한 Python 바인딩을 구성하는 가장 빠른 방법은 무엇입니까? (중요한 경우 Windows를 사용하고 있습니다.) 답변 Boost.Python을 봐야합니다. 다음은 웹 사이트에서 가져온 짧은 소개입니다. Boost Python Library는 Python과 C ++를 연결하기위한 프레임 워크입니다. 이를 통해 특수 도구없이 C ++ 컴파일러 만 사용하여 C ++ 클래스 함수 및 객체를 Python에 빠르고 원활하게 노출 할 수 있습니다. C ++ 인터페이스를 비 간섭 적으로 래핑하도록 설계되었으므로 래핑하기 위해 C ++ 코드를 전혀 변경하지 않아도되므로 Boost.Python은 타사 라이브러리를 Python에 노출하는 데..

C / C ++에 표준 부호 함수 (signum, sgn)를 사용하는 방법

질문 : C / C ++에 표준 부호 함수 (signum, sgn)가 있습니까? 음수에는 -1을, 양수에는 +1을 반환하는 함수를 원합니다. http://en.wikipedia.org/wiki/Sign_function 직접 작성하는 것은 쉽지만 어딘가에 표준 라이브러리에 있어야 할 것 같습니다. 편집 : 특히, 나는 수레에서 작동하는 기능을 찾고있었습니다. 답변 놀랍게도 아직 유형 안전 C ++ 버전을 게시 한 사람은 없습니다. template int sgn(T val) { return (T(0) < val) - (val < T(0)); } 혜택: 실제로 signum (-1, 0 또는 1)을 구현합니다. 여기서 copysign을 사용하는 구현은 signum이 아닌 -1 또는 1 만 반환합니다. 또한 여기..

#ifndef 및 #define이 C ++ 헤더 파일에서 사용되는 이유

질문 : #ifndef 및 #define이 C ++ 헤더 파일에서 사용되는 이유는 무엇입니까? 나는 일반적으로 헤더 파일의 시작 부분에서 다음과 같은 코드를 보았습니다. #ifndef HEADERFILE_H #define HEADERFILE_H 그리고 파일의 끝에는 #endif 이것의 목적은 무엇입니까? 답변 이를 #include 가드 라고합니다. 헤더가 포함되면 고유 값 (이 경우 HEADERFILE_H )이 정의되었는지 확인합니다. 그런 다음 정의되지 않은 경우 정의하고 나머지 페이지로 계속합니다. 코드가 다시 포함되면 첫 번째 ifndef 가 실패하여 빈 파일이 생성됩니다. 이는 유형, 열거 형 및 정적 변수와 같은 식별자의 이중 선언을 방지합니다. 출처 : https://stackoverflow...

C 또는 C ++를 사용하여 디렉토리의 파일 목록을 가져오는 방법

질문 : C 또는 C ++를 사용하여 디렉토리의 파일 목록을 어떻게 가져올 수 있습니까? 내 C 또는 C ++ 코드 내부에서 디렉토리의 파일 목록을 어떻게 확인할 수 있습니까? ls 명령을 실행하고 프로그램 내에서 결과를 구문 분석 할 수 없습니다. 답변 업데이트 2017 : C ++ 17에는 이제 파일 시스템의 파일을 나열하는 공식적인 방법이 있습니다 : std::filesystem . 이 소스 코드와 함께 Shreevardhan 의 훌륭한 답변이 아래에 있습니다. #include #include #include namespace fs = std::filesystem; int main() { std::string path = "/path/to/directory"; for (const auto & ent..

gcc의 C / C ++ 소스에서 assembler output 얻는 방법

질문 : gcc의 C / C ++ 소스에서 어셈블러 출력을 어떻게 얻습니까? 어떻게해야합니까? 무언가가 어떻게 컴파일되는지 분석하고 싶다면 내 보낸 어셈블리 코드를 어떻게 얻을 수 있습니까? 답변 gcc (또는 g ++)에 -S 옵션을 사용합니다. gcc -S helloworld.c 이것은 helloworld.c를 통해 전 처리기 (cpp)를 실행하고 초기 컴파일을 수행 한 다음 어셈블러가 실행되기 전에 중지됩니다. helloworld.s 파일을 출력합니다. -o 옵션을 사용하여 출력 파일을 설정할 수 있습니다. gcc -S -o my_asm_output.s helloworld.c 물론 이것은 원본 소스가있는 경우에만 작동합니다. 결과 객체 파일 만있는 경우 대안 --disassemble 옵션 (또는 축..

C 및 C ++에서 char를 int로 변환

질문 : C 및 C ++에서 char를 int로 변환 C 및 C ++에서 char 를 int 로 어떻게 변환합니까? 답변 수행하려는 작업에 따라 다릅니다. 값을 ASCII 코드로 읽으려면 다음과 같이 작성할 수 있습니다. char a = 'a'; int ia = (int)a; /* note that the int cast is not necessary -- int ia = a would suffice */ 문자 '0' -> 0 , '1' -> 1 등을 변환하려면 다음과 같이 쓸 수 있습니다. char a = '4'; int ia = a - '0'; /* check here if ia is bounded by 0 and 9 */ 설명 : a - '0' 은 ((int)a) - ((int)'0') 와 동일하며..

Visual Studio C / C ++ 콘솔 애플리케이션에서 콘솔 창이 닫히지 않도록 방지

질문 : Visual Studio C / C ++ 콘솔 애플리케이션에서 콘솔 창이 닫히지 않도록 방지 의심 할 여지없이 대답이 눈부시게 분명하기 때문에 이것은 아마도 당황스러운 질문 일 것입니다. 저는 Visual Studio를 수년간 사용해 왔지만 '콘솔 애플리케이션'개발을 한 것은 이번이 처음입니다. 응용 프로그램을 실행하면 콘솔 창이 나타나고 프로그램 출력이 나타난 다음 응용 프로그램이 종료되면 창이 닫힙니다. 출력을 확인할 때까지 열어 두거나 창을 닫은 후 결과를 볼 수있는 방법이 있습니까? 답변 Visual Studio 2017 (15.9.4)부터 옵션이 있습니다. Tools->Options->Debugging->Automatically close the console Visual Studio ..

SQLite의 초당 INSERT 성능 향상

질문 : SQLite의 초당 INSERT 성능 향상 SQLite를 최적화하는 것은 까다 롭습니다. C 애플리케이션의 대량 삽입 성능은 초당 85 개의 삽입에서 초당 96,000 개 이상의 삽입까지 다양합니다! 배경 : 우리는 데스크톱 애플리케이션의 일부로 SQLite를 사용하고 있습니다. 애플리케이션이 초기화 될 때 추가 처리를 위해 구문 분석되고 SQLite 데이터베이스에로드되는 XML 파일에 저장된 많은 양의 구성 데이터가 있습니다. SQLite는 빠르고 특별한 구성이 필요하지 않으며 데이터베이스가 단일 파일로 디스크에 저장되기 때문에 이러한 상황에 이상적입니다. 근거 : 처음에 나는 내가보고있는 성능에 실망했습니다. SQLite의 성능은 데이터베이스 구성 방법과 API 사용 방법에 따라 크게 다를 ..

C / C ++에서 "->"연산자가 의미하는 것

질문 : C / C ++에서 "->"연산자는 무엇입니까? comp.lang.c++.moderated 에서 Hidden Features and Dark Corners of C ++ / STL 을 읽은 후 다음 코드 조각이 Visual Studio 2008과 G ++ 4.4에서 컴파일되고 작동한다는 사실에 완전히 놀랐습니다. 코드는 다음과 같습니다. #include int main() { int x = 10; while (x --> 0) // x goes to 0 { printf("%d ", x); } } 산출: 9 8 7 6 5 4 3 2 1 0 GCC에서도 작동하기 때문에 이것이 C라고 가정합니다. 이것이 표준에서 정의 된 위치와 출처는 어디입니까? 답변 --> 은 연산자가 아닙니다. 실제로 두 개의 개..

C와 C ++ 모두에서 유효한 코드가 각 언어로 컴파일 될 때 다른 동작을 생성하는 방법

질문 : C와 C ++ 모두에서 유효한 코드가 각 언어로 컴파일 될 때 다른 동작을 생성 할 수 있습니까? C와 C ++에는 많은 차이가 있으며 모든 유효한 C 코드가 유효한 C ++ 코드는 아닙니다. ( "유효"란 정의 된 동작이있는 표준 코드를 의미합니다. 즉, 구현 특정 / 정의되지 않은 등이 아닙니다.) C와 C ++ 모두에서 유효한 코드 조각이 각 언어의 표준 컴파일러로 컴파일 될 때 다른 동작을 생성하는 시나리오가 있습니까? 합리적이고 유용한 비교를하기 위해 (질문에서 명백한 허점을 찾으려하지 않고 실질적으로 유용한 것을 배우려고합니다) 다음과 같이 가정 해 보겠습니다. 전처리 기와 관련된 것은 없습니다 (즉 #ifdef __cplusplus , pragma 등의 해킹이 없음을 의미합니다.) ..

표준 C ++ / C ++ 11 / C를 사용하여 파일이 존재하는지 확인하는 가장 빠른 방법

질문 : 표준 C ++ / C ++ 11 / C를 사용하여 파일이 존재하는지 확인하는 가장 빠른 방법은 무엇입니까? 표준 C ++ 11, C ++ 또는 C에 파일이 있는지 확인하는 가장 빠른 방법을 찾고 싶습니다. 수천 개의 파일이 있고 파일에 대해 작업을 수행하기 전에 모든 파일이 있는지 확인해야합니다. 다음 함수에서 /* SOMETHING */ 대신 무엇을 쓸 수 있습니까? inline bool exist(const std::string& name) { /* SOMETHING */ } 답변 글쎄요, 저는 이러한 방법을 각각 100,000 번 실행하는 테스트 프로그램을 함께 던졌습니다. 절반은 존재하는 파일이고 절반은 그렇지 않은 파일입니다. #include #include #include #inclu..

728x90
반응형