2016-03-10 17 views
7

Tak naprawdę jestem zaintrygowany tym, czy może przetrwać agresywną taktykę optymalizacji stosowaną przez GCC i klang.Czy nowa optymalizacja rozmieszczenia może przetrwać, w przeciwieństwie do memsetu?

Biorąc pod uwagę następujący przykład:

void* clean(void* pointer, std::size_t size) noexcept 
{ 
    return new(pointer) char[size]{}; 
} 

void doStuff() 
{ 
    //... 
    clean(pointer, size); 
    //... 
} 

mogę zaufać to zadanie czyszczenia poufnych danych?

+2

Nie można ufać nowemu rozmieszczeniu tablic [w ogóle] (http://stackoverflow.com/q/8720425)! –

+0

@KerrekSB przykład podany w tym pytaniu nie jest typem podstawowym. Wspomniane "y" jest wyrównaniem wymaganym przez dany typ, jeśli się nie mylę. – bit2shift

+0

@KerrekSB Po prostu się sprawdziłem, ['clean (wskaźnik, rozmiar);' nie dodaje żadnego dodatkowego narzuta w przypadku wyrównania wyrównania.] (Http://coliru.stacked-crooked.com/a/83952ed415cbd363) w ogóle sens, aby był narzut, gdy używa się wyrównanego 1-bajtowego typu. – bit2shift

Odpowiedz

2

Nie sądzę, że optymalizacja może tutaj przysłać jakiekolwiek sztuczki. Standardowe mandaty inicjalizacji wartość w tym przypadku: new(pointer) char[size]{}, więc po to pamięć wezwanie wskazywanego przez pointer byłaby wypełniona 0.

Może być kompilator może zoptymalizować go, jeśli nigdy nie otworzyć nowy wskaźnik lub zastąpić go przed accessin (w oparciu o obserwowalność). Jeśli chcesz uniknąć tej niewielkiej możliwości, musisz zdefiniować swój wskaźnik jako wskaźnik do volatile.

+0

Ale po, bufor nie jest używany. – Jarod42

+0

@ Jarod42, tak, pomyślałem o tym i zaktualizowałem moją odpowiedź. – SergeyA

+0

Nie ma "nowego (volatile void *, std :: size_t)" ... – Jarod42

2

Nie jestem pewien, czy jest to odpowiedź na pytanie, czy tylko na marginesie, ale można wyłączyć optymalizację na tej konkretnej funkcji stosując dyrektywę optimize() kompilator

void* __attribute__((optimize("O0"))) clean(void* pointer, std::size_t size) { 
    // unmodifiable compiler code 
} 

Zapewni to swoją czystą funkcję() będzie nie być zoptymalizowane od

Powiązane problemy