25 lutego 2013

C++ COTW - Placement new jako memcpy


#include <stdio.h>
#include <new>
 
struct Vec3d
{
    float x,y,z;
 
    Vec3d()
    {
        x = y = z = 0.0f;
    }
 
    Vec3d(float x, float y, float z)
    {
        this->x = x;
        this->y = y;
        this->z = z;
    }
 
};
 
int main()
{
 
    Vec3d v1(1.0f, 2.0f, 3.0);
    Vec3d v2;
 
    v2 = (*new(&v2)Vec3d(v1));
 
    printf("%f, %f, %f\n", v2.x, v2.y, v2.z);
}

Kolejna część z serii Coś Of The Week, dla C++. Tym razem został pokazany dość oryginalny sposób kopiowania danych, beż użycia bibliotecznej funkcji memcpy. Wykorzystać możemy do tego operator placement new i konstruktor kopiujący obiektu. Czy jest to wydajniejsze? Mówiąc szczerze, pomiarów nie dokonywałem, ale na pierwszy rzut oka, raczej nie. Poza tym, kod jest bardziej zagmatwany. Przydaje się to jednak wtedy, gdy nie mamy dostępu lub nie chcemy załączać nagłówków gdzie znajdują się funkcje operujące na pamięci. 
.

6 komentarzy:

  1. Gdzie takie coś widziałeś ?:D

    OdpowiedzUsuń
    Odpowiedzi
    1. W jakiś starych źródłach do Bulleta. Teraz szukałem, ale nie znalazłem już tego, a po starych rewizjach jakoś grzebać mi się nie chce ;)

      Usuń
  2. Dwie sprawy:
    1) new.h to nie jest standrdowy nagłówek.
    2) do użycia placement new nie potrzeba nagłówka new (bez .h). Potrzebny jest wyłącznie przy przeładodywaniu operatora new.

    OdpowiedzUsuń
    Odpowiedzi
    1. ad. 1 Zgadza się. Intellisense wyświetlił mi tylko new.h i jakoś tak z rozpędu go dołączyłem
      ad. 2 Bez nagłówka new, nie visual 2010 nie chce tego łyknąć (error C2660: 'operator new' : function does not take 2 arguments).

      Usuń
    2. To dziwne, mi zarówno na gcc ( https://ideone.com/CAdLbw ) jak i na visualu 2010 SP1 ( http://i.imgur.com/cLbMNHZ.png ) działa. Standard też nie wspomina nic o wymaganiu tego nagłówka, ale tutaj możliwe, że czegoś nie zauważyłem.

      Za Wikipedią: Default placement does not require the inclusion of the Standard C++ library header in the source code of a C++ program. ( http://en.wikipedia.org/wiki/Placement_syntax )

      Usuń
    3. Nie mam SP1 do VS'a. Możliwe, że konieczna obecność nagłówka new jest błędem, który SP1 naprawia.

      Usuń