Tags

  • AWS (7)
  • Apigee (3)
  • ArchLinux (5)
  • Array (6)
  • Backtracking (6)
  • BinarySearch (6)
  • C++ (19)
  • CI&CD (3)
  • Calculus (2)
  • DesignPattern (43)
  • DisasterRecovery (1)
  • Docker (8)
  • DynamicProgramming (20)
  • FileSystem (11)
  • Frontend (2)
  • FunctionalProgramming (1)
  • GCP (1)
  • Gentoo (6)
  • Git (15)
  • Golang (1)
  • Graph (10)
  • GraphQL (1)
  • Hardware (1)
  • Hash (1)
  • Kafka (1)
  • LinkedList (13)
  • Linux (27)
  • Lodash (2)
  • MacOS (3)
  • Makefile (1)
  • Map (5)
  • MathHistory (1)
  • MySQL (21)
  • Neovim (10)
  • Network (66)
  • Nginx (6)
  • Node.js (33)
  • OpenGL (6)
  • PriorityQueue (1)
  • ProgrammingLanguage (9)
  • Python (10)
  • RealAnalysis (20)
  • Recursion (3)
  • Redis (1)
  • RegularExpression (1)
  • Ruby (19)
  • SQLite (1)
  • Sentry (3)
  • Set (4)
  • Shell (3)
  • SoftwareEngineering (12)
  • Sorting (2)
  • Stack (4)
  • String (2)
  • SystemDesign (13)
  • Terraform (2)
  • Tree (24)
  • Trie (2)
  • TwoPointers (16)
  • TypeScript (3)
  • Ubuntu (4)
  • Home

    C++ Snippets

    Published Jun 24, 2019 [  C++  ]

    Performance

    Unary Operator

    vector vec;
    for(auto itr = vec.begin(); itr != vec.end(); itr++){
        itr.print();
    }
    
    vector vec;
    for(auto itr = vec.begin(); itr != vec.end(); ++itr){
        itr.print();
    }
    

    The second is better from a performance standpoint. This is because the post-increment operator is more expensive than the pre-increment operator. The underlying implementation of the post-increment oprator makes a copy of the element before incrementing it and then returns the copy.

    That said. many compilers will automatically optimize the first option by converting it into the second.

    Inheritance

    #include <iostream>
    
    class Base {
        virtual void method() {std::cout << "from Base" << std::endl;}
    public:
        virtual ~Base() {method();}
        void baseMethod() {method();}
    };
    
    class A : public Base {
        void method() {std::cout << "from A" << std::endl;}
    public:
        ~A() {method();}
    };
    
    // from A
    // from A
    // from Base
    int main(void) {
        Base* base = new A;
        base->baseMethod();
        delete base;
        return 0;
    }
    

    Exception

    Exception in Exception

    #include <iostream>
    
    class A {
        public:
            A() {}
            ~A(){
                throw 42;
            }
    };
    
    // This program will terminate abnormally. `throw 32` will start unwinding the stack and destroy class A. The class A destructor will 
    // throw another excception during the exception handling, which will cause program to crash.
    int main(int argc, const char *argv[]){
        try {
            A a;
            throw 32;
        } catch (int a){
            std::cout << a;
        }
    }
    

    Array and Pointer

    Pointer Operation

    #include <iostream>
    
    // 8 -> a[4] - a[0] + a[3]
    int main(int argc, const char *argv[]){
        int a[] = {1, 2, 3, 4, 5, 6};
        std::cout << (1 + 3)[a] - a[0] + (a + 1)[2];
    }
    

    Basics

    Unary Operators

    int i = 5;
    int j = i++;
    
    // i == 6, j == 5
    

    Variable Type

    #include <iostream>
    
    // 2^32 - 25
    int main(int argc, char **argv)
    {
        std::cout << 25u - 50;
        return 0;
    }
    
    unsigned char half_limit = 150;
    
    // this is an infinite loop
    for (unsigned char i = 0; i < 2 * half_limit; ++i)
    {
        // do something;
    }