나는std :: atomic 한 쌍의 원자 int32를 하나의 원자로 처리합니다. int64?
std::atomic<u32> _start;
std::atomic<u32> _end;
가 가끔 시작하거나 교환을 비교로 끝나는 설정할 부호 INT32의 쌍을, 그래서 전체 64 비트 쌍에 CAS를 사용하여 발생할 수 스퓨리어스 실패를 원하지 않는다. 32 비트 CAS를 사용하고 싶습니다.
_end.compare_exchange_strong(old_end, new_end);
이제 원자 1 64 비트 읽기로 시작과 끝을 모두 가져올 수 있습니다. 또는 두 개의 별도 32 비트 읽기 두 개의 메모리 울타리가있는 두 개의 개별 32 비트 비트 읽기 (또는 컴파일러가이를 최적화하도록 하시겠습니까?)가 아닌, 하나의 64 비트 원자 페치 (적절한 메모리 펜스를 추가하는 컴파일러 사용)를 수행하는 것이 더 빠르지 않습니까?
어떻게 C++ 11에서 그렇게 할 수 있을까요?
표준에서 유니온 허용 여부를 확인합니다. – PlasmaHH
@PlasmaHH : 어떻게 도움이 될까요?데이터가 원래 저장되어 있던 멤버 외부의 공용체를 통해 멤버에 액세스하는 것은 정의되지 않은 동작입니다. C++에서는 많은 사용자가이 작업과 같은 특정 작업을 기대한다고해도 아무런 의미가 없다고 말하지 않습니다 . –