23 Eylül 2019 Pazartesi

std::default_delete Yapısı

constructor
Örnek
Şöyle yaparız.
std::unique_ptr<int> u5 (new int, std::default_delete<int>());
Örnek
Şöyle yaparız.
std::default_delete<int> d;
std::unique_ptr<int> u4 (new int, d);

Undefined Behavior

Giriş
C ve C++'taki undefined behavior geçmişin bir mirası. Java ve C# gibi daha yeni dillerde undefined behavior'a ver yok.

İlginç bir şekilde undefined behavior kendi içinde sınıflandırılmış.

Ada ve C Karşılaştırması
Açıklaması şöyle.
Ada has a number of safety features built into the language. (Compare with C, where the standard has twelve pages that summarize the undefined behaviors built into the language. Compare with C++, where the undefined behaviors are so numerous that they don't even list them.) Those Ada safety features can have a significant performance cost, and because of this, Ada also supplies the ability to selectively disable those safety features.
Sık Karşılaşılan Undefined Behavior'lar
1. İlklendirilmemiş Değişken
Default Initialization yazısına bakabilirsiniz.

2. Signed Integer Overflow
Signed Integer Overflow yazısına bakabilirsiniz.

Bounded Undefined Behaviour
Açıklaması şöyle
Bounded UB is undefined behavior that cannot perform an illegal memory write, although it may trap and may produce or store indeterminate values.
Bellekte rastgele yerlere yazamaz. Şu davranışlar Bounded UB olarak tanımlı
  • multithreaded data races
  • use of a indeterminate values with automatic storage duration
  • strict aliasing violations
  • misaligned object access
  • signed integer overflow
  • unsequenced side-effects modify the same scalar or modify and read the same scalar
  • floating-to-integer or pointer-to-integer conversion overflow
  • bitwise shift by a negative or too large bit count
  • integer division by zero
  • use of a void expression
  • direct assignment or memcpy of inexactly-overlapped objects
  • restrict violations
  • etc.. ALL undefined behavior that's not in the critical list.
Criticial Undefined Behaviour
Açıklaması şöyle.
Critical UB is undefined behavior that might perform a memory write or a volatile memory read out of bounds of any object. A program that has critical undefined behavior may be susceptible to security exploits.
Şu davranışlar Critical UB olarak tanımlı.
  • access to an object outside of its lifetime (e.g. through a dangling pointer)
  • write to an object whose declarations are not compatible
  • function call through a function pointer whose type is not compatible with the type of the function it points to
  • lvalue expression is evaluated, but does not designate an object attempted modification of a string literal
  • dereferencing an invalid (null, indeterminate, etc) or past-the-end pointer
  • modification of a const object through a non-const pointer
  • call to a standard library function or macro with an invalid argument
  • call to a variadic standard library function with unexpected argument type (e.g. call to printf with an argument of the type that doesn't match its conversion specifier)
  • longjmp where there is no setjmp up the calling scope, across threads, or from within the scope of a VM type.
  • any use of the pointer that was deallocated by free or realloc
  • any string or wide string library function accesses an array out of bounds

19 Eylül 2019 Perşembe

Literal - Aynen Kullanılan Anlamına Gelir

Literal Nedir?
Literal aynen kullanılan değer anlamına gelir. Programlama dillerinde integerkayan noktastring gibi koda yazılan değerin işlemden geçmeden kelimesi kelimesine kullanılması için vardır.

C++ standardında <chrono>, <complex> ve <string> header'ları literal'ları tanımlıyor.

chrono içinde h,min,s,ms,us,ns ekleri var.
complex içinde i, il, if ekleri var.
string içinde s eki var.


1. Karakter/String Literal 
Ön Ekler
C++'ta sayısal literal ekleri sona yazılır. Karakter literal önekleri ise başa yazılır. Karakter literal ekleri R, u8, u8R,  u, uR, U, UR, L veya LR olabilir.

u8 - utf-8
u8 Literal yazısına taşıdım.
u - utf-16
char16_t* döndürür. Şöyle yaparız.
const char16_t* utf16string = u"\xD83D\xDE01";
U - utf-32
char32_t* döndürür. Şöyle yaparız.
const char32_t* utf32string = U"\x0001F601";

Son Ekler
s eki
String Literal s yazısına taşıdım.

Escape Sequence Karakterleri
String Literal ve Escape Sequence yazısına taşıdım.

2. Raw String Literal
Raw String Literal yazısına taşıdım.

3. Binary Literal
Yeni C++ ile bazı sayıları hex sabitler gibi yazmak yerine ikilik halini kullanmak mümkün.
unsigned int mask = 0b0111;

4. Integral Ekleri
Integral Literals yazısına taşıdım

5. User Defined Literal
User Defined Literal yazısına taşıdım.

16 Eylül 2019 Pazartesi

Identifier Nedir - Tanımlayıcı

Giriş
Her programlama dilinin bir Identifier tanımı bulunur. Java için şöyle.

C
Açıklaması şöyle.
  • All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.
  • All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.
C Dili Derleyicilerin Kendi Identifier Tanımı Yapmasına İzin Verir
Örneğin GNU C derleyicisi Identifier'ın $ karakteri ile başlamasına izin verir. Açıklaması şöyle.
In GNU C, you may normally use dollar signs in identifier names. This is because many traditional C implementations allow such identifiers. However, dollar signs in identifiers are not supported on a few target machines, typically because the target assembler does not allow them.
Örnek
Şöyle yaparız.
#include <stdio.h>

int main() {
    int myvar=13;
    int $var=42;
    printf("%d\n", myvar);
    printf("%d\n", $var);
}
Çıktı olarak şunu alırız.
13
42
C++
Açıklaması şöyle.
  • Each name that contains a double underscore (__) or begins with an underscore followed by an uppercase letter (2.11) is reserved to the implementation for any use.

Comma Operator Sequence Point'i

Giriş
Açıklaması şöyle
A pair of expressions separated by a comma is evaluated left-to-right; the left expression is a discarded-value expression (Clause [expr]). Every value computation and side effect associated with the left expression is sequenced before every value computation and side effect associated with the right expression.
Örneğin comma operator bir sequence point'tir ve işleme soldan sağa doğrudur. f (), g () çağrısında önce f () işletilir.

Örnek
i ve j sıfır ise soldan sağa işletilen kod sonucunda i=2 j=1 çıkar.
i = ++j, j = i++;
Örnek
Şöyle yaparız. Önce f() çağrılır, daha sonra g() çağrılır
f(x++), g(x++);
Örnek
Comma Operator Sequence Point return cümlesi için de geçerlidir. Elimizde şöyle bir kod olsun.
int fun(int x)
{
  return (x=x+2,x+1); //[A]
}

int main()
{
  int x=5;
  x=fun(x);
  printf("%d",x); // Output is 8
}
Bu kod aslında şöyledir. Sonuç olarak 8 verir.
x = x + 2; // x == 7
return x + 1; // returns 8


9 Eylül 2019 Pazartesi

std::make_array (experimental)

Giriş
Şu satırı dahil ederiz
#include <experimental/array>
Örnek
Şu kod derlenmez.
std::array<int, 6> = std::make_array(4,3,2);
Örnek
Şöyle yaparız.
#include <experimental/array>
int main()
{
    std::array<int,5> arr1= std::experimental::make_array(1, 2, 3, 4, 5); // ok
    std::array<int,3> arr2= std::experimental::make_array(1, 2, 3, 4, 5); // fails
    std::array<int,6> arr3= std::experimental::make_array(1, 2, 3, 4, 5); // fails
}