Open9
C++
テンプレート
Type Erasure
基本形
struct base {
virtual ~base() {}
};
template<class T>
struct derived : public base {
derived(const T& t) : t_(t) { }
virtual ~derived() {}
private:
T t_;
};
class X {
public:
template<class T>
X(const T& t) {
base = new derived<T>(t)
}
~X() {
delete p_;
}
private:
base* p_;
};
Compressed Pair(EBO)
template<typename A, typename B>
struct cp : public A {
B b;
template<typename... Args>
cp(Args... args) : A(), b(std::forward<Args>(args)...){}
A& f() {return *this;}
B& s(){return b;}
};
int main() {
cp<std::hash<int>, int> a(10);
int b = a.f()(a.s());
std::cout << b << std::endl; // 10
std::cout << sizeof(a) << std::endl; // 4
std::pair<std::hash<int>, int> p(std::hash<int>(), 10);
std::cout << sizeof(p) << std::endl; // 8
}
本
ノンブロッキング
メモリバリア
re-order
コンパイラ最適化時にソースコードの処理順が意味的に同等になる範囲で処理の順番を変更すること。
または、
プログラム実行時にCPUの処理最適化で意味的に同等になる範囲で実行順序を変更すること。
bitfield
構造体のメンバ変数の使用するビット範囲を指定する。コンパイラによってパディングの仕様が異なるので注意
// clang18.0.0
struct S {
uint32_t a : 16;
uint32_t b : 8;
uint32_t c : 7;
//uint32_t d : 2;
};
int main()
{
// S s = {0b0000000001111111, 0b00000001, 0b1000000, 0b11};
S s = {0b0000000001111111, 0b00000001, 0b1000000};
cout << sizeof(s) << endl; // 4, コメントを取ると8になった
}