간단한 c 구조체를 생각해 보겠습니다.
struct foo { const char * str; unsigned char flag; uint64_t len; };
이 코드가 64비트 시스템에서 실행되는 프로그램의 일부로 실행된다고 가정해 보겠습니다. sizeof(struct foo)의 결과는 어떻게 될까요?
구조체 크기와 최적화를 망쳐본 적이 없는 대부분의 사람들은 17이 되어야 한다고 추측할 것입니다...
... 하지만 24살이에요! 왜 그럴까요?
이러한 동작의 이유는 컴파일러가 속도를 위해 구조체 레이아웃을 최적화하고, 정렬된 메모리 액세스가 데이터에 액세스하는 가장 빠른 방법이라는 것이 현대 표준이기 때문입니다.
즉, 필드 및 CPU 유형에 따라 데이터가 일부 정렬을 가지며 정렬이 준수되도록(또는 필드 주소 % 필드 정렬 == 0) 배치됩니다.
크기, 정렬, 패딩
이전 예의 경우 포인터와 64비트 필드는 64비트 시스템에서 8B로 정렬됩니다. 즉, 구조체의 모든 항목이 정렬되는 레이아웃을 강제로 적용하기 위해 컴파일러는 일부를 생성합니다. 플래그와 len 필드 사이의 패딩:
이제 이전과 동일한 시스템에서 이와 같은 구조체가 정의된 또 다른 예를 고려해 보겠습니다.
struct bar { const char * str; short s1; int i1 short s2; int i2; };
크기를 어떻게 계산하나요?
세 가지 규칙이 있습니다.
- 구조체 필드는 고유한 자연스러운 정렬에 맞춰 정렬되기를 원합니다.
- 전체 구조체 정렬은 가장 넓은 필드의 정렬과 동일합니다
- 동일한 유형의 두 구조체를 나란히 배치해야 하는 경우 두 번째 구조체는 해당 정렬에 맞춰 정렬되어야 합니다. 이는 구조체에 해당 정렬까지 후행 패딩이 있어야 함을 의미합니다.
64비트 시스템의 기본 유형 정렬 및 크기에 대한 빠른 요약:
type | size | alignment |
---|---|---|
char | 1 | 1 |
short | 2 | 2 |
int | 4 | 4 |
long | 8 | 8 |
float | 4 | 4 |
double | 8 | 8 |
pointers | 8 | 8 |
다음 사항도 기억하세요.
- 배열은 값 유형의 정렬과 sizeof(type) * 요소 수의 크기를 갖습니다.
- Union은 가장 넓은 구성원의 정렬과 크기를 갖습니다.
그리고 매우 유용한 sizeof 및 _Alignof 연산자를 사용하여 사용자 정의 유형에 대한 이 정보를 얻을 수 있습니다. _Alignof는 C11부터 사용할 수 있으며 C23부터 alignof라고 합니다. C 11 이후로 항상 C에서 이해하는 것과는 alignof였습니다.
이 주제에 대한 자세한 내용은 The Lost Art of Structure Packing에서 많은 연습과 실무 경험을 통해 제가 아는 거의 모든 것을 배웠습니다.
구조체 최적화: stropt
이 주제는 직장에서 자주 언급되는 내용으로, 대기열 등에서 막대한 양의 데이터를 지속적으로 전송할 때 여기저기서 바이트를 절약하는 것이 매우 중요합니다.
내 삶을 더 쉽게 만들기 위해 소스 파일이나 코드 조각을 참조하여 입력으로 전달하는 유형에 대한 통계를 생성하는 stropt (구조체 최적화 프로그램).
GitHub의 Abathargh/stropt빌드 및 설치
로컬 Go가 설치되어 있는 경우 바로 애플리케이션을 빌드하거나 직접 설치할 수 있습니다.
struct foo { const char * str; unsigned char flag; uint64_t len; };os/archs 조합 목록에 대해 이미 컴파일된 바이너리도 github 릴리스 페이지에서 제공됩니다.
스트롭 바이너리
도구를 사용하여
분석할 소스를 문자열로 전달하여 stropt를 사용할 수 있습니다.
struct bar { const char * str; short s1; int i1 short s2; int i2; };
git clone https://github.com/Abathargh/stropt go build // or, if you want to install this directly go install github.com/Abathargh/stropt
다음은 무엇입니까
이 도구는 C 코드 구문 분석을 위한 뛰어난 modernc.org/cc C 컴파일러 프런트 엔드와 UI용 charmbracelet의 립글로스를 사용하여 Go에서 작성되었습니다.
이 글은 나 자신을 위해 작성되었지만 공개적으로 공유하게 되어 기쁩니다. 브라우저에서 직접 더 쉽게 사용할 수 있도록 이것을 웹앱으로 만들고 싶습니다. 아마도 이것이 제가 작업할 다음 작업일 것입니다!
위 내용은 C 구조체 레이아웃 최적화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Golang과 C는 각각 공연 경쟁에서 고유 한 장점을 가지고 있습니다. 1) Golang은 높은 동시성과 빠른 발전에 적합하며 2) C는 더 높은 성능과 세밀한 제어를 제공합니다. 선택은 프로젝트 요구 사항 및 팀 기술 스택을 기반으로해야합니다.

Golang은 빠른 개발 및 동시 프로그래밍에 적합한 반면 C는 극심한 성능과 기본 제어가 필요한 프로젝트에 더 적합합니다. 1) Golang의 동시성 모델은 Goroutine 및 Channel을 통한 동시성 프로그래밍을 단순화합니다. 2) C의 템플릿 프로그래밍은 일반적인 코드 및 성능 최적화를 제공합니다. 3) Golang의 쓰레기 수집은 편리하지만 성능에 영향을 줄 수 있습니다. C의 메모리 관리는 복잡하지만 제어는 괜찮습니다.

goimpactsdevelopmentpositively throughlyspeed, 효율성 및 단순성.

C는 하드웨어 리소스 및 고성능 최적화가 직접 제어되는 시나리오에 더 적합하지만 Golang은 빠른 개발 및 높은 동시성 처리가 필요한 시나리오에 더 적합합니다. 1.C의 장점은 게임 개발과 같은 고성능 요구에 적합한 하드웨어 특성 및 높은 최적화 기능에 가깝습니다. 2. Golang의 장점은 간결한 구문 및 자연 동시성 지원에 있으며, 이는 동시성 서비스 개발에 적합합니다.

Golang은 실제 응용 분야에서 탁월하며 단순성, 효율성 및 동시성으로 유명합니다. 1) 동시 프로그래밍은 Goroutines 및 채널을 통해 구현됩니다. 2) Flexible Code는 인터페이스 및 다형성을 사용하여 작성됩니다. 3) NET/HTTP 패키지로 네트워크 프로그래밍 단순화, 4) 효율적인 동시 크롤러 구축, 5) 도구 및 모범 사례를 통해 디버깅 및 최적화.

GO의 핵심 기능에는 쓰레기 수집, 정적 연결 및 동시성 지원이 포함됩니다. 1. Go Language의 동시성 모델은 고루틴 및 채널을 통한 효율적인 동시 프로그래밍을 실현합니다. 2. 인터페이스 및 다형성은 인터페이스 방법을 통해 구현되므로 서로 다른 유형을 통일 된 방식으로 처리 할 수 있습니다. 3. 기본 사용법은 기능 정의 및 호출의 효율성을 보여줍니다. 4. 고급 사용에서 슬라이스는 동적 크기 조정의 강력한 기능을 제공합니다. 5. 레이스 조건과 같은 일반적인 오류는 Getest-race를 통해 감지 및 해결할 수 있습니다. 6. 성능 최적화는 sync.pool을 통해 개체를 재사용하여 쓰레기 수집 압력을 줄입니다.

Go Language는 효율적이고 확장 가능한 시스템을 구축하는 데 잘 작동합니다. 장점은 다음과 같습니다. 1. 고성능 : 기계 코드로 컴파일, 빠른 달리기 속도; 2. 동시 프로그래밍 : 고어 라틴 및 채널을 통한 멀티 태스킹 단순화; 3. 단순성 : 간결한 구문, 학습 및 유지 보수 비용 절감; 4. 크로스 플랫폼 : 크로스 플랫폼 컴파일, 쉬운 배포를 지원합니다.

SQL 쿼리 결과의 정렬에 대해 혼란스러워합니다. SQL을 학습하는 과정에서 종종 혼란스러운 문제가 발생합니다. 최근 저자는 "Mick-SQL 기본 사항"을 읽고 있습니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.
