메모리<->cpu간 작업시간을 최소로 단축시킬수있는 작업단위는 몇비트인가요??

k1d0bus3의 이미지

구조체 링크드리스트(or 배열)을 만들어서, 메모리 <-> cpu간 r/w을 하려고 합니다.

제가알기로는 cpu는 32bit단위로 처리하고, 메모리 입출력단위는 8bit로 알고있습니다.

가능한한 메모리 <-> cpu간 작업처리시간을 줄이려면,(메모리에있는 구조체의 각멤버필드를 read/write하려고 합니다)

이때 구조체전체크기나 각각의멤버필드를

32bit의 배수에 맞추는게 유리합니까? 8bit의 배수에 맞추는게 유리합니까?

구체적으로 말하자면....

다음의 구조체 멤버들의 자료형은 어떡게 선언하는게 최선일까요?

비트필드로 선언하는게 유리합니까?

struct person{
어떤자료형? dataA; (크기는최소3bit이상되야함)
어떤자료형? dataB; (크기는최소10bit이상되야함)
struct person* link; (32bit)
};

ddoman의 이미지

Quote:

이때 구조체전체크기나 각각의멤버필드를
32bit의 배수에 맞추는게 유리합니까? 8bit의 배수에 맞추는게 유리합니까?

struct의 사이즈는
컴파일러가 해당 architecture의 word size의 배수로, 가장 자연스러운 사이즈로 알아서 조정하여 줍니다.

그래서 그렇게 하지 말아달라고 컴파일러에게 지시하는 전처리 명령어들이 있습니다. 가령 #pragma pack.
검색해보시면 관련 문서 많이 나옵니다.

==================
메모리 접근은 word 단위로 하는것이 가장 자연스럽습니다: http://en.wikipedia.org/wiki/Word_%28computing%29
각 architecture 마다 word의 사이즈는 다를수도 있습니다.
자세한 설명은 위키페이지의 설명 참고하세요.

하지만...속도를 위해서라면
이런것보다, 어떻게 하면 cache-friendly 코드를 만들까 생각하는게 훨신 생산적입니다.
메모리는 너무너무너무너무 엄청나게 느립니다. 그래서 OS는 메모리접근의 횟수를 최대한 적게하려고 노력합니다.

메모리 접근이 빈번하면 전반적인 시스템이 엄청느려집니다.
cache-hit rate가 1%만 떨어져도 엄청난 속도 저하가 나타납니다.

또한, 메모리 fragmentation 을 막기위해 메모리 풀같은걸 구현하여 사용하는게
훨신 영양가 높은 방법입니다.