문제

최근에 동일한 서명되지 않은 단편을 사용하여 두 값을 저장하는 일부 코드, 결과 및 ID를 예를 들어 작성했습니다.

unsigned short data = new_id();
// result is either 0 or 1 so store it in the rightmost bit and move the id left
data = (data << 1) + get_result();
// ... later ...
// now we can print results like
printf("%u: %u\n", data & 1, data >> 1);

구조물을 사용하여 두 값을 모두 보유하는 것이 더 낫습니까? 이 프로그램은 이미 너무 많은 메모리를 저장하여 사용하는 메모리를 줄이는 방법을 찾기 시작했다고 생각했습니다.

도움이 되었습니까?

해결책

비트 필드 (그러나 공간에서 단단 해야하는 경우에만 - 즉 임베디드 시스템)?

typedef struct id_result {
    unsigned int id : 15;
    unsigned int result : 1;
} id_result;

그렇지 않으면 예,보다 완전하고 의미있는 정의가있는 구조물을 사용하십시오.

typedef uint16 IDTYPE; /* assuming uint16 exists elsewhere */

typedef struct id_result {
    IDTYPE id;
    bool result;
} id_result;

다른 팁

메모리가 엄청나게 빡빡하지 않으면 구조물 경로로 갈 것입니다. 코드를 유지 해야하는 다음 사람에게는 훨씬 더 명확하고 더 쉽습니다.

M68000에 32 비트 주소 레지스터가 있었지만 실제로 24 비트 만 사용되는 시간이 떠올랐습니다. 프로그래머는 다른 8 비트에 정보를 저장하기 위해 모든 종류의 "최적화"를 수행했습니다. M68030과 같이 칩의 이후 버전이 32 비트를 모두 사용했을 때 소년은 얼굴이 빨간색이었습니다.

메모리가 절대적으로없는 한, 나는 두 가지 변수를 가진 구조를 갖는 더 간단한 접근을 원합니다. 가독성을 높이고 유지 보수 노력을 줄입니다.

이것이 메모리 사용량을 줄이기위한 목적으로 만 수행된다면, 나는 당신이 그렇게해서는 안된다고 생각합니다. 코드를 훨씬 더 읽기 쉽게 만드는 2 개의 반바지가있는 구조를 사용하는 것이 좋습니다. 코드를 더욱 유지 관리 할 수있게함으로써 얻을 수있는 이점에 비해이 작업을 수행하여 저장하는 메모리의 양.

먼저 시스템을 프로파일 링하여 메모리 누출이 있는지 또는 누군가가 불필요하게 큰 메모리 덩어리를 할당하는지 여부를 찾은 다음 해당 문제를 해결하려고합니다. 여전히 솔루션을 찾을 수 없다면 프로그램의 어느 부분이 대부분의 메모리를 차지하고 메모리 할당 모델을 다시 설계하려고 시도하십시오.

비트 필드로 메모리 보존에 대해 조언하는 사람들에게 : 몇 년이 지남에 따라 컴퓨터가 더 많은 기가 바이트를 얻을수록 L1 $ (빠른 메모리)는 수십 킬로 바이트로 남아 있습니다. 오늘날 대부분의 응용 프로그램에서 대부분의 시간은 L1 $에 느린 메모리가 도착하기를 기다리는 데 소비됩니다.

느린 메모리는 대부분의 응용 프로그램에서 병목 현상이므로 비트 필드로 메모리를 보존하면 실제로 애플리케이션 속도를 크게 증가시킬 수 있습니다. 이것은 20 년 전에는 사실이 아닙니다.

두 반바지를 단일 짧은 짧은 일에 장착하는 것은 구조물을 사용하는 것보다 더 많은 작업과 오류가 발생하기 쉽습니다. 덜 메모리를 사용하는 경우 실제로 필요한 경우 구조물로 비트 필드를 지정할 수 있습니다.

struct myStruct {
int data:8;
int result:8;
};

코드의 전반적인 유지 보수 가능성을 높이는 동일한 메모리 감소 결과를 달성합니다.

비트 필드가있는 스트러크가 가장 이해하기 쉬운 구현입니다. 그 접근법을 사용하지 않으면 세트를 사용할 수 있습니다. 잘 기록 된 매크로 해당 팩 및 값 쌍을 16 비트 값으로 안팎으로 포장합니다.

스트러크/물체를 사용하는 것이 반드시 가장 좋거나 명확한 접근법은 아닙니다.

간단한 정수 데이터 포인트 세트가 있다고 가정 해 봅시다. 그러나 MSB를 사용하여 '사용하지 않는'으로 단순히 MSB를 사용하는 경우 알고리즘에 추가 해야하는 모든 것은

if ( item > 0 )
   item += blah

그러나 구조물이 있으면 모든 산술이 있으면 이제 멤버 액세스가 필요합니다.

if ( item.valid() ) 
   item.setValue(item.getValue() + blah);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top