1 Temmuz 2019 Pazartesi

As-If Kuralı

Giriş
Kural şunu söyler : Bir kod parçası, yazılımın gözlemlenebilen davranışı değişecek şekilde etkilemiyorsa, optimize edilebilir. Açıklaması şöyle.
The rule that allows any and all code transformations that do not change the observable behavior of the program
Açıklaması şöyle.
The as-if rule
Allows any and all code transformations that do not change the observable behavior of the program
Explanation
The C++ compiler is permitted to perform any changes to the program as long as the following remains true: [...]
Kullanılmayan Üye Alan
Kullanılmayan üye alan silinebilir.
Örnek
Görmek için şöyle yaparız.
#include <iostream>

struct Foo1
{ int var1 = 5;           Foo1() { std::cout << var1; } };

struct Foo2
{ int var1 = 5; int var2; Foo2() { std::cout << var1; } };

void f1() { (void) Foo1{}; }
Örnek
Şöyle yaparız. set.insert() bir pair döner ancak kodda .first alane erişilmiyor. Derleyici bu alanı silebilir.
bool insert(std::set<int>& set, int value)
{
  return set.insert(value).second;
}
Comma Operator İçin Uygulanabilir
Açıklaması şöyle
In a comma expression E1, E2, the expression E1 is evaluated, its result is discarded ..., and its side effects are completed before evaluation of the expression E2 begins
E1'in yan etkisi olmadığı görülürse E1 çalıştırılmaz. Açıklaması şöyle
To put it simply, E1 will be evaluated, although the compiler might optimize it away by the as-if rule if it is able to determine that there are no side-effects.
Kuralın Uygulanamadığı Durumlar
Örnekte m[i] kodu hiç bir şey yapmıyor gibi görünse de aslında belirtilen anahtar için bir value nesnesi atıyor. Dolayısıyla optimize edilip silinemez.
#include <map>
#include <vector>
#include <iostream>

using namespace std;

int main()
{
  vector<int> keys = {0, 1};

  map<int, int> m;
  m[1] = 5;
  m[2] = 12;

  for (const int i : keys)
  {
    m[i]; // touch value
  }

  for (auto const & kv : m)
  {
    cout << kv.first << ", " << kv.second << endl;
  }
}


Hiç yorum yok:

Yorum Gönder