KR20030036971A - C/c++의 구조체 크기 최적화 방법 - Google Patents

C/c++의 구조체 크기 최적화 방법 Download PDF

Info

Publication number
KR20030036971A
KR20030036971A KR1020010067925A KR20010067925A KR20030036971A KR 20030036971 A KR20030036971 A KR 20030036971A KR 1020010067925 A KR1020010067925 A KR 1020010067925A KR 20010067925 A KR20010067925 A KR 20010067925A KR 20030036971 A KR20030036971 A KR 20030036971A
Authority
KR
South Korea
Prior art keywords
component
size
compiler
fill
exists
Prior art date
Application number
KR1020010067925A
Other languages
English (en)
Inventor
노종석
Original Assignee
엘지엔시스(주)
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 엘지엔시스(주) filed Critical 엘지엔시스(주)
Priority to KR1020010067925A priority Critical patent/KR20030036971A/ko
Publication of KR20030036971A publication Critical patent/KR20030036971A/ko

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

본 발명은 C/C++의 구조체 크기 최적화 방법에 관한 것으로, 특히 종래 기술은 구조체 구성 요소들의 배치를 프로그래머가 열거한 순서대로 시스템의 ABI 룰에 따라 배치하고, 필요할 경우 fill 바이트를 넣어주는 방식으로 구성 요소 배치에 대한 최적화 개념이 없었으므로, 프로그래머가 구조체 사이즈나 정렬에 대해 잘 알고 있는 경우에는 문제가 없겠지만 대부분의 프로그래머가 이런 분야에 대한 지식이 별로 없다는 것을 감안하면 메모리/기억 장치의 낭비를 초래할 수 있었다. 따라서, 본 발명은 ABI 정렬 룰에 기초한 소스 레벨 구성 요소 재배치를 실시하여 구조체 사이즈를 최적화하는 방법을 제공하여, 데이터 기억 장치 사용량을 줄이는 동시에 프로그램 실행시 메모리 사용량을 최적화하는 효과가 있다.

Description

C/C++의 구조체 크기 최적화 방법{METHOD FOR STRUCTURE SIZE OPTIMIZATION IN C/C++}
본 발명은 C/C++의 구조체 사이즈 최적화 방법에 관한 것으로, 특히 ABI 정렬룰에 기초한 소스 레벨 요소 재배치를 실시하여 구조체 사이즈를 최적화하게 함으로써 데이터 저장 사용량을 줄이는 동시에 프로그램 실행 시 메모리의 사용량을 최적화하는 방법에 관한 것이다.
구조체 프로그램 언어인 C나 객체 지향 언어인 C++등에서 사용되는 모든 데이터 타입은 프로세서에 따라 다르게 적용될 수 있는 ABI 규격에 따라 메모리 배열에 맞게 배치되어야 한다.
만일, 규격을 위반했을 경우, 프로그램 실행 시에 프로세서에 따라 다르지만 버스 에러, 정렬 에러 등의 오류가 발생한다.
그 중에서도 구조체(struct/union in C, struct/union, class in C++)는 전체 구조체와 이를 구성하는 요소들이 모두 정렬 룰에 따라 배치되어야 한다. 그 결과로 구조체 구성 요소들의 내부 배치에 따라 메모리를 낭비할 수도 있다.
도 1은 C/C++의 기본 데이터 타입에 대한 사이즈/정렬 테이블 예시도로써, 인텔사의 i386계열 프로세서(386, 486, Pentium, Pentium-Pro, Pentium 2, Pentium 3, Xeon 등)에 적용되는 C/C++의 기본 데이터 타입에 대한 사이즈와 배열을 나타낸다.
이 후, 도 1을 참조하여 구조체 구성 요소 배치 방법을 설명하기로 한다.
도 2는 종래 기술에 따른 구조체 구성 요소 배치 방법을 설명하기 위한 플로우차트이다.
지금까지의 기술은 컴파일러에서 구조체에 대한 매모리 맵을 잡을 때, 이에 대한 최적화 개념은 없었으며, 따라서 구조체 구성 요소 재배치 기능이 없었다.
도 2를 참조하여, 기존 컴파일러에서의 동작 원리를 간략히 살펴보면 다음과 같다.
컴파일러는 목표 시스템의 사이즈 및 정렬 정보를 활용할 수 있는 형태로 수집하는데(S100), 종속적인 도구이므로 사이즈나 정렬 정보를 별도로 수집하는 과정이 따로 필요없고, 정해진 정보를 가져와 사용하기만 하면 된다.
컴파일러는 입력으로 지정된 프로그램에서 구조체가 있는지를 판단하여(S110), 구조체가 있을 경우, 이의 구성 요소들을 차례로 배치하고 다음 구성 요소를 배치할 때, 이 요소의 정렬에 맞으며, 가장 가까이에 있는 어드레스에 배치하면 된다. 즉 fill 바이트가 필요한지를 판단할 필요도 없이 차례대로 정렬에 맞게 배치하기만 하면 된다.
도면에 도시된 S120에서 S170의 단계는 상기 과정을 구현하기 위한 동작 알고리즘이고, 설명은 생략하기로 한다.
또 소스 레벨 최적화 과정이 아니고, 컴파일 과정의 메모리 맵 설정 과정으로 처리되므로 구성 요소와 메모리 어드레스의 매핑만 한다. 이와 관련된 정보는 컴파일러에서 사용하는 심볼 테이블과 같은 구조로 저장되고 활용된다.
도 3은 종래 기술에 따른 구조체 구성 요소 배치 예시도이다.
이 구조체의 전체 사이즈는 20바이트가 된다. 이는 C/C++의 sizeof 연산자를 이용하여 알아볼 수 있으며, 실제로 8바이트가 낭비되고 있음을 알 수 있다.
그러나, 상기에서와 같이 종래의 기술에 있어서, 구조체 구성 요소들의 배치를 프로그래머가 열거한 순서대로 ABI 룰에 따라 배치하고 필요할 경우 fill바이트를 넣어주는 방식으로 구성 요소 배치에 대한 최적화 개념이 없었다. 이것은 프로그래머가 구조체 사이즈와 정렬에 대해 잘 알고 있는 경우는 문제가 없겠지만 대부분의 프로그래머가 이런 분야에 대한 지식이 별로 없다는 것을 감안하면 앞의 예에서와 같이 최악의 메모리/기억 장치 낭비를 초래할 수 있는 문제점이 있다.
따라서, 본 발명은 상기와 같은 종래의 문제점을 해결하기 위하여 창출한 것으로, 특히 ABI 정렬룰에 기초한 소스 레벨 요소 재배치를 실시하여 구조체 사이즈를 최적화하는 C/C++에서의 구조체 크기 최적화 방법을 제공함에 그 목적이 있다.
상기의 목적을 달성하기 위한 본 발명의 일 실시 예는, 목표 시스템의 사이즈 및 정렬 정보를 계산하는 제 1 단계와; 입력 소스 코드 파일을 해석하여 구조체가 있는지를 판단하여, 상기 판단 결과 구조체가 있을 경우 다음 단계를 수행하고, 구조체가 없을 경우 종료하는 제 2 단계와; 상기 제 2 단게에서 검출된 구조체의 각 구성 요소를 차례로 스캐닝하여 구성 요소들 사이의 fill 바이트의 수를 계산하는 제 3 단계와; 상기 3 단계에서 계산된 fill 바이트에 배치될 구성 요소가 있는지를 검출하여, 검출된 구성 요소가 있을 경우 상기 fill 바이트에 재배치하는 제 4 단계와; 상기 재 배치된 구조체의 결과를 저장한 후, 내포 구조체 또는 다른 구조체가 존재하는지를 판단하여, 상기 판단 결과, 존재할 경우 제 2 단계로 궤환되고, 존재하지 않을 경우 종료하는 제 5 단계로 이루어진 것을 특징으로 한다.
도 1은 C/C++의 기본 데이터 타입에 대한 사이즈/정렬 테이블 예시도.
도 2는 종래 기술에 따른 구조체 구성 요소 배치 방법을 설명하기 위한 플로우차트.
도 3은 종래 기술에 따른 구조체 구성 요소 배치 예시도.
도 4는 본 발명에 따른 C/C++의 구조체 크기 최적화 방법을 설명하기 위한 플로우차트.
도 5는 본 발명에 따른 구조체 구성 요소 배치 예시도.
이하, 본 발명에 따른 일실시예를 첨부한 도면을 참조하여 상세히 설명하면 다음과 같다.
본 발명의 방법을 수행하는 알고리즘인 컴파일러는 기존 컴파일서에서 사용되는 여러 모듈과 상호 연관되어 동작하거나, 독자적으로 동작할 수 있도록 구현된다.
즉, 별도의 명령어 형식으로 만들어질 수도 있고, 또 기존의 컴파일러 모듈인 CPP(C Pre Processor)의 부분 모듈로 동작하게 하도록 하는 등 다양하게 구현될 수 있다.
도 4는 본 발명에 따른 C/C++의 구조체 크기 최적화 방법을 설명하기 위한 플로우 차트이다.
도 4를 참조하면, 본 발명의 C/C++의 구조체 크기 최적화 방법은 크게 목표 시스템의 데이터 사이즈 및 정렬 정보를 계산하는 단계(S200)와; 프로그램 소스 코드에 정의된 구조체의 구성 요소들을 정렬 룰에 따라 재배치하여 최적화하는 단계(S210~S270)로 이루어진다.
상기 S200의 단계는 보조 단계로 본 방법에서 이용할 시스템 정보를 수집하는 것인데, 이식성이나 호환성을 고려하지 않는다면 한번 수집된 정보를 기존의 컴파일러에서와 같이 하드 코드 형태로 유지할 수도 있다. 그러나, 본 발명의 방법이임의의 목표 시스템에 적용되도록 하기 위하여 프로세서의 ABI 정보가 없이도 자체적으로 시스템 정보를 추출하여 동작할 수 있도록 하기 위해 상기 S200의 단계를 포함한다.
상기 S210~S270의 단계는 수집된 정보를 활용하여 실제 최적화를 하는 부분이다.
이 부분은 소스 코드 입력 기능, 구조체 검색 기능, 구조체 구성 요소 재배치 기능, 지시어 처리 기능, 결과 출력 기능으로 이루어진다.
이후, 도 4를 참조하여 본 발명의 방법을 상세히 설명하기로 한다.
우선, 컴파일러는 실행될 목표 시스템의 사이즈 및 정렬 정보를 수집하는데(S200), 이를 상세히 설명하면 다음과 같다.
C/C++에서 사용되는 기본 데이터 타입에 대한 사이즈 및 정렬 정보는 적당한 구조체를 구성한 후, 각 구성 요소들의 메모리의 위치를 확인하면 되는데, 예를 들어 더블 타입에 대한 사이즈 및 정렬을 계산하려면, 사이즈는 sizeof 연산자를 사용하면 되고, 정렬을 계산하기 위해서는 캐릭터 타입과 더블 타입의 멤버를 차례로 갖는 구조체를 구성한 후 더블 타입의 멤버 어드레스에서 캐릭터 타입 멤버의 어드레스를 빼면 더블 타입의 정렬이 된다.
struct dsz{
double d1;
char c1;
double d2;
} dsz;
즉, 상기의 구조체를 선언하고, 하기와 같이 계산하면 된다.
&dsz.d2 - &dsz.c1
상기 컴파일러는 입력 소스 코드 파일을 해석하여 구조체가 있는지를 검색한다(S210). C/C++에서 사용되는 구조체는 struct, union, class(C++ only)로 시작하여 "; "로 끝나며 블록 형태의 복합 문장이 올 수도 있고, 또 내포될 수도 있다. 만일 구조체가 내포되면 처리 루틴을 재귀적으로 호출한다.
상기 S210의 판단 결과, 구조체가 존재할 경우, 컴파일러는 구조체 단위로 적용/비적용 여부를 판단하게 되는데(S220), 이는 본 발명의 알고리즘이 적용되지 않는 기존 목적 코드와의 호환성 유지가 필요할 경우 지시어 형식으로 프로그래머가 선택적으로 사용할 수 있도록 한다. 구현의 일 예로 CPP의 #pragma 지시어의 옵션으로 추가하여 사용할 수 있다.
상기 S220의 판단 결과, 최적화가 적용될 경우, 컴파일러는 S200단계에서 미리 계산된 정보를 활용하여 구조체의 각 구성 요소를 차례로 스캐닝하여 구조체 각 구성 요소의 사이즈 및 정렬 정보를 수집하고(S230), 구성 요소들 사이에 들어가는 fill바이트의 수를 계산한다(S240).
상기 S240에서 계산해낸 fill 바이트의 수를 참조하여, fill 바이트에 재배치될 구성 요소가 존재하는지를 판단한다(S250).
상기 S250의 판단 결과, fill 바이트에 재배치될 구성 요소가 존재할 경우,상기 검출된 구성 요소를 fill 바이트 내에 재배치한다(S260).
여기서, 재배치 가능 구성 요소를 선택하는 알고리즘으로는 일반적으로 사용되는 메모리 관리 알고리즘을 사용할 수 있는데, 이는 널리 알려진 알고리즘으로 best fit, optimal fit, worst fit 알고리즘 등이 있다.
도 5는 본 발명에 의해 재배치된 일례를 도시한 도면으로, 도 2에 제시한 구조체를 본 발명의 방법에 따라 재배치되어 최적화된 메모리 맵을 나타낸다.
도 5를 참조하면, 20 바이트이던 구조체의 사이즈가 12 바이트로 줄어들게 되어 실제 40%의 개선 효과가 있다.
또한, 이 경우는 32 비트 프로세서인 Intel i386계열의 예이고, 정렬이 큰 다른 프로세서에서는 더 많은 개선 효과가 있을 수 있다. 실제로, 64 비트 프로세서에서는 long long 형이나, double형은 8 바이트 정렬을 사용하는 경우도 있다.
최적화 처리후, 컴파일러는 내포되거나, 또 다른 구조체가 존재하는지를 판단한 후(S270), 존재할 경우, 상기 S220의 단계로 궤환된다.
도면에는 도시되어 있지 않지만, 모든 구조체에 대한 처리가 끝나면 그 결과를 저장한 후, 종료한다(S270).
이상의 본 발명은 상기에 기술된 실시예들에 의해 한정되지 않고, 당업자들에 의해 다양한 변형 및 변경을 가져올 수 있으며, 이는 첨부된 청구항에서 정의되는 본 발명의 취지와 범위에 포함된다.
이상에서 설명한 바와 같이 본 발명은 구조체의 크기를 최적화함으로써 메모리나 기억 장치의 낭비를 최소화 할 뿐만 아니라, 자료 처리의 입출력이 줄어들게 되므로 처리 성능의 향상을 꾀할 수 있다는 효과가 있다.

Claims (2)

  1. 목표 시스템의 사이즈 및 정렬 정보를 계산하는 제 1 단계와;
    입력 소스 코드 파일을 해석하여 구조체가 있는지를 판단하여, 상기 판단 결과 구조체가 있을 경우 다음 단계를 수행하고, 구조체가 없을 경우 종료하는 제 2 단계와;
    상기 제 2 단계에서 검출된 구조체의 각 구성 요소를 차례로 스캐닝하여 구성 요소들 사이의 fill 바이트의 수를 계산하는 제 3 단계와;
    상기 3 단계에서 계산된 fill 바이트에 배치될 구성 요소가 있는지를 검출하여, 검출된 구성 요소가 있을 경우 상기 fill 바이트에 재배치하는 제 4 단계와;
    상기 재 배치된 구조체의 결과를 저장한 후, 내포 구조체 또는 다른 구조체가 존재하는지를 판단하여, 상기 판단 결과, 존재할 경우 제 2 단계로 궤환되고, 존재하지 않을 경우 종료하는 제 5 단계로 이루어지는 것을 특징으로 하는 C/C++의 구조체 크기 최적화 방법.
  2. 제1항에 있어서, 상기 제 3 단계는
    구조체가 존재할 경우, 구조체 단위로 최적화 적용/비적용 여부를 판단하는 단계를 더 포함하는 것을 특징으로 하는 C/C++의 구조체 크기 최적화 방법.
KR1020010067925A 2001-11-01 2001-11-01 C/c++의 구조체 크기 최적화 방법 KR20030036971A (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020010067925A KR20030036971A (ko) 2001-11-01 2001-11-01 C/c++의 구조체 크기 최적화 방법

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020010067925A KR20030036971A (ko) 2001-11-01 2001-11-01 C/c++의 구조체 크기 최적화 방법

Publications (1)

Publication Number Publication Date
KR20030036971A true KR20030036971A (ko) 2003-05-12

Family

ID=29567560

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020010067925A KR20030036971A (ko) 2001-11-01 2001-11-01 C/c++의 구조체 크기 최적화 방법

Country Status (1)

Country Link
KR (1) KR20030036971A (ko)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101102530B1 (ko) * 2009-11-17 2012-01-04 선문대학교 산학협력단 조합적 캐쉬 시뮬레이션을 활용한 동적 할당 구조체 레이아웃 재배치 방법
CN116991428A (zh) * 2023-09-28 2023-11-03 飞腾信息技术有限公司 一种编译方法、装置、编译器、计算设备及存储介质

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101102530B1 (ko) * 2009-11-17 2012-01-04 선문대학교 산학협력단 조합적 캐쉬 시뮬레이션을 활용한 동적 할당 구조체 레이아웃 재배치 방법
CN116991428A (zh) * 2023-09-28 2023-11-03 飞腾信息技术有限公司 一种编译方法、装置、编译器、计算设备及存储介质
CN116991428B (zh) * 2023-09-28 2023-12-15 飞腾信息技术有限公司 一种编译方法、装置、编译器、计算设备及存储介质

Similar Documents

Publication Publication Date Title
JP3311462B2 (ja) コンパイル処理装置
Chow et al. Effective representation of aliases and indirect memory operations in SSA form
US5428793A (en) Method and apparatus for compiling computer programs with interproceduural register allocation
US5740443A (en) Call-site specific selective automatic inlining
US7069548B2 (en) Inter-procedure global register allocation method
US7356813B2 (en) System and method for optimizing a program
US20020010911A1 (en) Compile time pointer analysis algorithm statement of government interest
US8458681B1 (en) Method and system for optimizing the object code of a program
CA2172772A1 (en) Method and apparatus for an improved optimizing compiler
EP0373361A2 (en) Generating efficient code for a computer with dissimilar register spaces
JP2500079B2 (ja) プログラムの最適化方法及びコンパイラ・システム
IE920606A1 (en) Interface for representing effects in a multilanguage¹optimizing compiler
EP0529049B1 (en) Multilanguage optimizing compiler using templates in multiple pass code generation
US4843545A (en) Compile method using copy propagation of a variable
US7143402B2 (en) Method and apparatus for precision optimization in compiled programs
US6330714B1 (en) Method and computer program product for implementing redundant lock avoidance
US20040068719A1 (en) System and method for optimizing a program
US8108847B2 (en) Pairing of spills for parallel registers
US5845127A (en) Language processor and language processing method to generate object programs by compiling source programs
US20020062478A1 (en) Compiler for compiling source programs in an object-oriented programming language
US7406681B1 (en) Automatic conversion of source code from 32-bit to 64-bit
US8966463B2 (en) Eliminating redundant function calls
Lattner et al. Data structure analysis: A fast and scalable context-sensitive heap analysis
US20230350655A1 (en) Deterministic memory allocation for real-time applications
KR20030036971A (ko) C/c++의 구조체 크기 최적화 방법

Legal Events

Date Code Title Description
N231 Notification of change of applicant
WITN Withdrawal due to no request for examination