[c++] 한 명의 회원과 만 조합을 사용하는 목적은 무엇입니까?

seastar 소스 코드를 읽을 때 tx_side멤버가 하나 뿐인 공용 구조체가 있음을 알았습니다 . 이것은 특정 문제를 다루기위한 해킹입니까?

참고로 tx_side아래 구조를 붙여 넣습니다 .

union tx_side {
    tx_side() {}
    ~tx_side() {}
    void init() { new (&a) aa; }
    struct aa {
        std::deque<work_item*> pending_fifo;
    } a;
} _tx;



답변

때문에 tx_side노조는, tx_side()하지 자동으로 초기화 / 구문을 수행 a하고, ~tx_side()자동으로 소멸되지 않습니다. 이를 통해 배치 및 신규 소멸자 호출 (가난한 사람 )을 통해 a및 의 수명을 세밀하게 제어 할 수 있습니다 .pending_fifostd::optional

예를 들면 다음과 같습니다.

#include <iostream>

struct A
{
    A() {std::cout << "A()\n";}
    ~A() {std::cout << "~A()\n";}
};

union B
{
    A a;
    B() {}
    ~B() {}
};

int main()
{
    B b;
}

여기서는 구성되거나 파괴되지 B b;않기 때문에 아무것도 인쇄하지 a않습니다.

경우 B했다 struct, B()부를 것이다 A(), 그리고 ~B()부를 것이다 ~A(), 당신은 그것을 방지 할 수 없습니다.


답변

간단히 말해서, 값을 명시 적으로 할당 / 초기화 하지 않으면 단일 멤버 통합 은 할당 된 메모리를 초기화하지 않습니다. 이 기능은 std:: optionalc ++ 17에서 수행 할 수 있습니다 .


답변