이것은 팁이 아닌데, 어디 적당히 리포트할 곳이 없어서 여기에 씁니다.
보통 통신 쪽 작업을 하게 되면 프로토콜을 1바이트 정렬을 사용하는 경우가 많습니다.
그러면 당연히 해당 구조체나 클래스는 1바이트 정렬로 만듭니다.
#pragma pack(1)
이렇게 하면 1바이트 메모리 경계 정렬이 되죠.
그리고 원상 복구는
#pragma pack()
이는 디폴트 값으로 돌리는데 보통 4바이트 정렬이 기본값입니다.
그런데, 이렇게 만들어진 구조체나 클래스는
다른 클래스내에 멤버로 선언한 경우,
당연히 아무런 문제가 없어야 합니다.
다른 클래스가 메모리 경계 정렬이 어떻게 되어 있던 상관없이 아무 이상없어야 합니다.
하지만 빌더6에서는
1바이트 정렬로 만든 구조체를
다른 클래스의 멤버로 몇개 넣었는데
두 구조체간의 데이타를 복사하기 위해
class_a->struct_instance1 = class_a->struct_instance2;
식으로 처리하니
2바이트가 밀려서 값이 들어가는 것이 이상해서 추적해보니
컴파일러 버그 더군요.
그래서 해당 클래스도 1바이트 정렬로 맞추니 괜잖아 지더군요.
이 현상은
빌더 6외에 다른 버전은 확인을 못했습니다.
참고하세요.
|
c로된 장비의 펌웨어와 BCB의 코드에 구조체를 선언한 같은 Header 파일을 쓰는데
그런데 이상하게 동작하더라구요
8bit cpu 로 돌아가는 장비에서는 아무 신경쓰지 않아도 되지만
32bit cpu를 쓰는 pc에서는 신경써서 정렬을 해줘야는데....