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_fifo
std::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:: optional
c ++ 17에서 수행 할 수 있습니다 .