Initialization

Initialization

  • https://en.cppreference.com/w/cpp/language/initialization
  • https://eel.is/c++draft/dcl.init
  • https://github.com/randomnetcat/cpp_initialization

Default initalization

int foo(int& x);

int main(){
    int x;
    return foo(x);
}
struct X{ int x; };
int foo(X* x);

int main(){
    return foo(new X);
}
main:
        sub     rsp, 8
        mov     edi, 4
        call    operator new(unsigned long)
        add     rsp, 8
        mov     rdi, rax
        jmp     foo(X*)
main:
        sub     rsp, 24
        lea     rdi, [rsp+12]
        call    foo(int&)
        add     rsp, 24
        ret

Value initalization

struct X{ int x; };
int foo(X* x);

int main(){
    return foo(new X());
}
main:
        sub     rsp, 8
        mov     edi, 4
        call    operator new(unsigned long)
        mov     DWORD PTR [rax], 0
        mov     rdi, rax
        add     rsp, 8
        jmp     foo(X*)
int foo(int& x);

int main(){
    int x{};
    return foo(x);
}
main:
        sub     rsp, 24
        lea     rdi, [rsp+12]
        mov     DWORD PTR [rsp+12], 0
        call    foo(int&)
        add     rsp, 24
        ret
int foo(int& x);
int x;

int main(){
    return foo(x);
}

Direct initalization

int main() {                                                                    
   std::vector<int> x{5};                                                                                                                                                                                
   std::cout << x.size() << '\n';                                                
}                                                                               
1
int main() {                                                                    
   std::vector<int> x(5);                                                                                                                                                                                
   std::cout << x.size() << '\n';                                                
}                                                                               
5

List initalization

int main() {                                                                    
   std::vector<int> x{5, 2};                                                                                                                                                                                
   std::cout << x.size() << '\n';                                                
}                                                                               
2

Aggregate initalization

struct Sub {
    int x;
    int y;
};
struct Agg{
    Sub sub;
    int z;
};

int main(){
    Agg x{{1, 2}, 3};
    return foo(x);
}
struct Sub {
    int x;
    int y;
};
struct Agg{
    Sub sub;
    int z;
};

int main(){
    Agg x{1, 2, 3};
    return foo(x);
}

deck

By technology