-
Rust::SmartPointer
String
과Vec<T>
또한 Smart Pointer이다(엄밀하게는 String은 Vec<u8>의 Wrapper이다). 메모리 주소를 간직하고 있고, 특정 메타데이터(len, capacity...)를 포함하고 있으며 여러 부가 기능들을 갖고 있기 때문이다.
-
OS::Basic
CPU Efficency를 최상으로 높이는 방법
으로는, Context Switching을 가장 최소로 낮추며 Multiprocessing Execution을 고안하는 것이다. 보유 CPU 개수 당 이상적으로 핸들링할 수 있는 최종 Logical CPU의 개수만큼의 OS Thread를 생성하여 병렬성을 최대로 유지하되 최소의 Context Switching 상태를 유지할 수 있기만 하면 된다.
-
ETC
-
바이트 순서(Byte Order)
[10u8, 3u8, 62u8, 142u8] # 바이트 배열이 존재할 경우, # = 0x 0A 03 3E 8E # = 0b 0000 1010 / 0000 0011 / 0011 1110 / 1000 1110 # = 167984782 (decimal) 왼쪽으로 갈수록 커지는, 사람이 읽는 방식
-
Little-Endian
으로 저장한다는 것은 메모리에# 리버스 된 [14u8, 62u8, 3u8, 10u8] # = 0x 8E 3E 03 0A # = 0b 1000 1110 / 0011 1110 / 0000 0011 / 0000 1010 # 사람이 읽는 방식에서의 작은 바이트 부분부터 다시 앞으로 오는 방식
이 순서로 저장한다는 것이다.
-
Big-Endian
으로 저장한다는 것은 메모리에[10u8, 3u8, 62u8, 142u8]
존재하는 순서 그대로 저장한다는 것이다.
-
Middle-Endian
은 둘 모두에 속하지 않거나 둘 모두를 지원하는 것을 지칭한다.- 특정 아키텍처에서는 2바이트 단위와 1바이트 단위로 서로 다른 순서를 사용하기도 한다.
-
오늘날
x86 아키텍처
를 사용하는 대부분의 데스크톱 컴퓨터는리틀 엔디언
을 쓰며 이를인텔 포맷
이라 한다. 거꾸로네트워크에서는 주소를 빅 엔디언
으로 쓰는데, 역사적으로 라우팅이 전화를 거는 식으로 접두 부호로 이루어졌기 때문이다.이의 영향으로 많은 프로토콜과 몇몇 파일 포맷이 빅 엔디언을 사용
하고 있다. 모토로라 프로세서들은 일반적으로 빅 엔디언을 사용하며,ARM 프로세서들은 성능 향상을 위해 빅 엔디언과 리틀 엔디언을 선택할 수 있도록 되어 있다.
-
장단점
-
Big Endian
의 경우 프로그래머의 디버깅이 편해지는 장점이 있다. 메모리 내의 값을 확인할 때, 순서대로 표기하는 것과 순서대로 선언해 놓았던 변수의 표기가 일치하기 때문이다. 이를테면 0x123456을 메모리에 넣었을 경우, 그것들을 메모리상에서 순서대로 뽑아낼 경우 그대로 12 34 56 으로 보이기 때문이다. -
반면
Little Endian
의 경우 메모리상에 저장되어 있는 값 중 하위값만을 사용해야 할 때가 있을 경우, 이를테면 32비트(4바이트) 숫자인데 값이 0x12가 존재한다고 했을 때, Big Endian으로 저장해놓을 경우 0x00 00 00 12로 저장이 되어 하위 비트만을 사용하고자 했을 때 0x12만을 바로 뽑아내지 못하고 3바이트를 더 계산해서 자리를 찾아가야 한다. 그러나 Little Endian일 경우 0x12 00 00 00로서 저장되어, 앞의 8비트만 뽑아내면 되기 때문이다.
-
-
-
비트에도 순서
가 중요할 경우도 정말 가끔 있을 수 있는데, 그때에는 최하위 비트 우선(LSB
), 최상위 비트 우선(MSB
)이라는 순서명이 존재한다. 대표적으로 PNG, GIF가 존재하는데, 각각 최상위, 최하위 비트 우선을 사용한다.
-