13 sierpnia 2022

Narzędzia #8 (tmux, cppInsights)

tmux

Narzędzie o multiplikowania i zapisywania stanu sesji. Możemy wygodnie przełączać się pomiędzy kilkoma sesjami oraz nadawać im nazwy dla wygodniejszej pracy. Po zamknięciu konsoli możemy wygodnie powrócić do ostatniej konfiguracji.

sudo apt-get install tmux

Aby powrócić do ostatniej sesji:

tmux a

Screenshot

Skróty

Skrót Opis
Ctrl + b; s Widok wszystkich sesji z możliwością przełączania
Ctrl + b; w Widok wszystkich sesji i okien z możliwością przełączania
Ctrl + b; $ Zmiana nazwy aktywnej sesji
Skrót Opis
Ctrl + b; c Otwarcie nowego okna w aktywnej sesji
Ctrl + b; $ Zmiana nazwy aktywnej sesji
Ctrl + b; , Zmiana nazwy aktywnego okna
Ctrl + d Zamknięcie otwartego okna
Ctrl + b; n Przełączenie do kolejnego okna w sesji
Ctrl + b; p Przełączenie do poprzedniego okna w sesji
Ctrl + b; f Znajdź okno
Skrót Opis
Ctrl + b; % Podziel widok horyzontalnie
Ctrl + b; " Podziel widok wertykalnie
Ctrl + b; o Przełączenia pomiędzy oknami w danym widoku
Skrót Opis
Ctrl + b; ? Wyświetlenie pomocy
Ctrl + b; : Konsola komend tmux, pozwala na bardziej zaawansowane operacja

Komendy

Komenda Opis
:swap-pane -U Przenieś okno w górę (na liście okien)
:swap-pane -D Przenieś okno w dół (na liście okien)

Linki


Kompilator c++ wyświetlający kod pośredni. Jeśli kiedykolwiek zastanawiałeś się, jak kompilator zoptymalizuje dane wyrażenie, to dzięki temu narzędziu możesz to sprawdzić.

Możesz sprawdzić:

  • jak closure są przekazywane do lambdy
  • jak kompilator optymalizuje wartość zwracaną z funkcji
  • jakie iteratory są używane przy for eatch

Screenshot

cppinsights

Przykłady

Mając poniższy kod:

#include <cstdio>
#include <vector>

int main()
{
    std::vector<int> vec = {1,2,3,4};
	const int value_1 = 33;
  
  	auto cb = [&](auto a) {
      return value_1 * a;
    };
  
 	for(auto item : vec) {
      printf("%d", cb(item));
    }
}

Otrzymujemy poniższy wynik. Możemy łatwo zaobserwować:

  • vector jako template jest instancjowany nie tylko typem elementu, ale też domyślnym alokatorem
  • lambda jest osobną klasą
  • domknięcia używane przez lambdę to pola prywatne klasy ustawiane w konstruktorze
  • pętla for korzysta z iteratorów w tym przypadku nie const
#include <cstdio>
#include <vector>

int main()
{
  std::vector<int, std::allocator<int> > vec = std::vector<int, std::allocator<int> >{std::initializer_list<int>{1, 2, 3, 4}, std::allocator<int>()};
  const int value_1 = 33;
    
  class __lambda_9_14
  {
    public: 
    template<class type_parameter_0_0>
    inline /*constexpr */ auto operator()(type_parameter_0_0 a) const
    {
      return value_1 * a;
    }
    
    #ifdef INSIGHTS_USE_TEMPLATE
    template<>
    inline /*constexpr */ int operator()<int>(int a) const
    {
      return value_1 * a;
    }
    #endif
    
    private: 
    const int & value_1;
    
    public:
    __lambda_9_14(const int & _value_1)
    : value_1{_value_1}
    {}
    
  };
  
  __lambda_9_14 cb = __lambda_9_14{value_1};
  {
    std::vector<int, std::allocator<int> > & __range1 = vec;
    __gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > > __begin1 = __range1.begin();
    __gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > > __end1 = __range1.end();
    for(; __gnu_cxx::operator!=(__begin1, __end1); __begin1.operator++()) {
      int item = __begin1.operator*();
      printf("%d", cb.operator()(item));
    }
    
  }
  return 0;
}