Thread View: pl.comp.lang.c
33 messages
33 total messages
Started by Borneq
Sun, 09 Oct 2016 18:55
Jeszcze sprytne wskaźniki
Author: Borneq
Date: Sun, 09 Oct 2016 18:55
Date: Sun, 09 Oct 2016 18:55
23 lines
1945 bytes
1945 bytes
W Wikipedii: https://en.wikipedia.org/wiki/Smart_pointer std::unique_ptr<int> p1(new int(5)); std::unique_ptr<int> p2 = p1; //Compile error. std::unique_ptr<int> p3 = std::move(p1); //Transfers ownership. p3 now owns the memory and p1 is rendered invalid. p3.reset(); //Deletes the memory. p1.reset(); //Does nothing. new int(5) znaczy to samo co new int[5] - tablica ? ale ani w debugerze ani w kodzie nie mogę dostać się do elementu [i] bardzo dobra sprawa że przypisanie zostaje już wyeliminowane w procesie kompilacji p1.reset() w destruktorze? a może automatycznie destruktor to wykona? Jest std::move(p1) a nie ma std::copy(p1), czasem jednak chcielibyśmy wykonać kopię danych, wtedy std::unique_ptr<int> p2(new int(5)); i pętla for? a może memcpy ale czy zadziała? Jak za pomocą unique_ptr wykonać coś takiego że gdy mamy operator typu * czy + tworzące obiekt tymczasowy oraz operator przypisania, to przypisze mi w kodzie z elementu tymczasowego, przypisywanie do tymczasowego nie zabierze czasu i będzie można go spokojnie skasować, kasowanie tymczasowego nie skasuje danych?
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Sun, 09 Oct 2016 19:18
Date: Sun, 09 Oct 2016 19:18
8 lines
1224 bytes
1224 bytes
W dniu 09.10.2016 o 20:55, Borneq pisze: > new int(5) znaczy to samo co new int[5] - tablica ? > ale ani w debugerze ani w kodzie nie mogę dostać się do elementu [i] > bardzo dobra sprawa że przypisanie zostaje już wyeliminowane w procesie > kompilacji Tu jeszcze : https://pl.wikibooks.org/wiki/C%2B%2B/Zarz%C4%85dzanie_pami%C4%99ci%C4%85
Re: Jeszcze sprytne wskaźniki
Author: bartekltg
Date: Sun, 09 Oct 2016 20:16
Date: Sun, 09 Oct 2016 20:16
51 lines
2368 bytes
2368 bytes
On 09.10.2016 20:55, Borneq wrote: > W Wikipedii: https://en.wikipedia.org/wiki/Smart_pointer Dostałeś dwa łądne linki pokazujące dobrę i lepszą metdę używania unique_ptr jako wskaźników do tablic. Więc postanowiłeś pójść na wikipedię:) > std::unique_ptr<int> p1(new int(5)); > std::unique_ptr<int> p2 = p1; //Compile error. > std::unique_ptr<int> p3 = std::move(p1); //Transfers ownership. p3 now > owns the memory and p1 is rendered invalid. > > p3.reset(); //Deletes the memory. > p1.reset(); //Does nothing. > > new int(5) znaczy to samo co new int[5] - tablica ? Oczywiście, że nie. Próbowałeś w ogole wpisać "new int(5)" w googe? Oni tam tworzą wskaźnik pokazujacy gdzieśtam na pamieć, a w tej pamieci jest liczba 5. > ale ani w debugerze ani w kodzie nie mogę dostać się do elementu [i] Bo taki element nie istnieje;-) > Jest std::move(p1) a nie ma std::copy(p1), czasem jednak chcielibyśmy > wykonać kopię danych, wtedy > std::unique_ptr<int> p2(new int(5)); > i pętla for? a może memcpy ale czy zadziała? memcpy? To piszesz w C czy c++? Dla intów zadziała. Będziesz miał bardziej skomplikowane obiekty i leżysz. std::copy http://en.cppreference.com/w/cpp/algorithm I copy i memcpy wymaga wyciągniecia gołego wskaźnika metodą get. vectro wygodniejszy;> Jeśli chces zużywać optymalizacji dla małych rozmiarów, masz do tego gotowca w booscie (też linkowałem). pzdr bartekltg
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Sun, 09 Oct 2016 20:45
Date: Sun, 09 Oct 2016 20:45
8 lines
1191 bytes
1191 bytes
W dniu 09.10.2016 o 22:16, bartekltg pisze: > Dostałeś dwa łądne linki pokazujące dobrę i lepszą > metdę używania unique_ptr jako wskaźników do tablic. > Jeśli chces zużywać optymalizacji dla małych rozmiarów, > masz do tego gotowca w booscie (też linkowałem). Poszukam
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Sun, 09 Oct 2016 20:50
Date: Sun, 09 Oct 2016 20:50
15 lines
1469 bytes
1469 bytes
W dniu 09.10.2016 o 22:45, Borneq pisze: > W dniu 09.10.2016 o 22:16, bartekltg pisze: >> Dostałeś dwa łądne linki pokazujące dobrę i lepszą >> metdę używania unique_ptr jako wskaźników do tablic. > >> Jeśli chces zużywać optymalizacji dla małych rozmiarów, >> masz do tego gotowca w booscie (też linkowałem). > > Poszukam > Nawet 2 ciekawe: (http://www.boost.org/doc/libs/1_62_0/doc/html/container/non_standard_containers.html#container.non_standard_containers) - static_vector - small_vector
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Sun, 09 Oct 2016 20:53
Date: Sun, 09 Oct 2016 20:53
6 lines
1192 bytes
1192 bytes
W dniu 09.10.2016 o 22:50, Borneq pisze: > - static_vector > - small_vector raczej pierwszy; nie jest powiedziane że ma być mało elementów, może być bardzo dużo, ale gdy mało, to ma nie być new/delete
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Sun, 09 Oct 2016 21:11
Date: Sun, 09 Oct 2016 21:11
45 lines
2411 bytes
2411 bytes
W dniu 09.10.2016 o 22:53, Borneq pisze:
> W dniu 09.10.2016 o 22:50, Borneq pisze:
>> - static_vector
>> - small_vector
>
> raczej pierwszy; nie jest powiedziane że ma być mało elementów, może być
> bardzo dużo, ale gdy mało, to ma nie być new/delete
To było by to, ale jest napisane:
//!@tparam Capacity The maximum number of elements static_vector can
store, fixed at compile time.
using namespace boost::container;
static_vector<elem_t,1> elems;
następnie rozszerzam do 100:
elems.resize(100);
ale jest błąd w:
template <class InsertionProxy>
iterator priv_forward_range_insert_at_end
(const size_type n, const InsertionProxy insert_range_proxy,
version_0)
{
//Check if we have enough memory or try to expand current memory
const size_type remaining = this->m_holder.capacity() -
this->m_holder.m_size;
if (n > remaining){
//This will trigger an error
throw_bad_alloc();
}
this->priv_forward_range_insert_at_end_expand_forward(n,
insert_range_proxy);
return this->end();
}
this->m_holder.capacity() ma 1 jak ustawiłem
this->m_holder.m_size - bieżące zero
n = 100, remaining = 1
if (n > remaining){
//This will trigger an error
throw_bad_alloc();
}
Albo błąd w bibliotece, albo czegoś innego używa się zamiast resize()
Re: Jeszcze sprytne wskaźniki
Author: bartekltg
Date: Sun, 09 Oct 2016 21:32
Date: Sun, 09 Oct 2016 21:32
25 lines
1845 bytes
1845 bytes
On 09.10.2016 23:11, Borneq wrote: > W dniu 09.10.2016 o 22:53, Borneq pisze: >> W dniu 09.10.2016 o 22:50, Borneq pisze: >>> - static_vector >>> - small_vector >> >> raczej pierwszy; nie jest powiedziane że ma być mało elementów, może być >> bardzo dużo, ale gdy mało, to ma nie być new/delete > > To było by to, ale jest napisane: > //!@tparam Capacity The maximum number of elements static_vector can > store, fixed at compile time. > > using namespace boost::container; > static_vector<elem_t,1> elems; > następnie rozszerzam do 100: > elems.resize(100); A przeczytaj raz jeszcze zdanie powyżej. Stworzyłes wektor o _maksymalnie_ jednym elemencie (pod spodem ejst zwykła statyczna tablica na jeden element). Jak chcesz to rozszerzyć do 100? pzdr bartekltg
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Sun, 09 Oct 2016 21:48
Date: Sun, 09 Oct 2016 21:48
33 lines
2212 bytes
2212 bytes
W dniu 09.10.2016 o 23:32, bartekltg pisze:
> A przeczytaj raz jeszcze zdanie powyżej.
> Stworzyłes wektor o _maksymalnie_ jednym elemencie
> (pod spodem ejst zwykła statyczna tablica na jeden element).
> Jak chcesz to rozszerzyć do 100?
Czyli to nie jest to, chodziło o rozszerzalny z mała ilością stałych.
a jak jest w standardowym vectorze?
Mam przykładowo:
Liczba& Liczba::operator=(const Liczba& v)
{
data = v.data;
}
a co robi operator przypisania?
Inaczej zachowuje się dla tymczasowego a inaczej dla normalnego - tak
było by świetnie;
_Myt& operator=(const _Myt& _Right)
{ // assign _Right
if (this != &_Right)
{ // different, assign it
if (this->_Getal() != _Right._Getal()
&& _Alty::propagate_on_container_copy_assignment::value)
{ // change allocator before copying
_Tidy();
this->_Copy_alloc(_Right._Getal());
}
this->_Orphan_all();
...............
_Copy_alloc tylko jest dla normalnego, sprawdzanie za pomocą _Getal(),
ale tego _Getal() nie mogę znaleźć w całym katalogu include, co takiego
robi? Jakby tak tego użyć we własnej klasie.
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Sun, 09 Oct 2016 21:55
Date: Sun, 09 Oct 2016 21:55
11 lines
1735 bytes
1735 bytes
W dniu 09.10.2016 o 23:48, Borneq pisze: > _Copy_alloc tylko jest dla normalnego, sprawdzanie za pomocą _Getal(), > ale tego _Getal() nie mogę znaleźć w całym katalogu include, co takiego > robi? Jakby tak tego użyć we własnej klasie. Czy da się z uniqe_ptr wydobyć goły wskaźnik (tylko do odczytu, zawartość wskazywana będzie mogła być modyfikowana) w http://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr czegoś takiego nie widzę, a potrzebne było by bo wybierałbym pointerem - albo dynamiczną tablicę uniq_ptr, albo wskaźnik na statyczną w segmencie danych lub stosie
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Sun, 09 Oct 2016 22:53
Date: Sun, 09 Oct 2016 22:53
10 lines
1660 bytes
1660 bytes
W dniu 09.10.2016 o 23:55, Borneq pisze: > Czy da się z uniqe_ptr wydobyć goły wskaźnik (tylko do odczytu, > zawartość wskazywana będzie mogła być modyfikowana) > w http://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr czegoś > takiego nie widzę, a potrzebne było by bo wybierałbym pointerem - albo > dynamiczną tablicę uniq_ptr, albo wskaźnik na statyczną w segmencie > danych lub stosie Raw pointer - nie trzeba wydobywać, gdy jest znany przed konstrukcją unique_ptr
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Sun, 09 Oct 2016 22:59
Date: Sun, 09 Oct 2016 22:59
6 lines
1542 bytes
1542 bytes
W dniu 10.10.2016 o 00:53, Borneq pisze: > Raw pointer - nie trzeba wydobywać, gdy jest znany przed konstrukcją > unique_ptr Dokładnie opisałem zapytanie na forum: https://social.msdn.microsoft.com/Forums/vstudio/en-US/3421bad8-9236-4ab4-9551-0555dab1dd9e/how-distinguish-between-objects-and-temporary-objects?forum=vcgeneral
Re: Jeszcze sprytne wskaźniki
Author: bartekltg
Date: Sun, 09 Oct 2016 23:25
Date: Sun, 09 Oct 2016 23:25
33 lines
2349 bytes
2349 bytes
On 09.10.2016 23:55, Borneq wrote: > W dniu 09.10.2016 o 23:48, Borneq pisze: >> _Copy_alloc tylko jest dla normalnego, sprawdzanie za pomocą _Getal(), >> ale tego _Getal() nie mogę znaleźć w całym katalogu include, co takiego >> robi? Jakby tak tego użyć we własnej klasie. > > Czy da się z uniqe_ptr wydobyć goły wskaźnik (tylko do odczytu, > zawartość wskazywana będzie mogła być modyfikowana) > w http://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr czegoś > takiego nie widzę, No jak się patrzysz na stronę o konstruktorze, to jasne, że listy metod nie znajdziesz ;-) > a potrzebne było by bo wybierałbym pointerem - albo > dynamiczną tablicę uniq_ptr, albo wskaźnik na statyczną w segmencie > danych lub stosie Coś mi się wydaje, że próbujesz znów odstrzelić sobie palca;-) OK, vector z ajkiś dziwnych powodów Ci się nie podoba, od u-ptr chcesz dziwnych rzeczy, boostowe vectroy też złe. OK, no to być może czas na własny kontener. Tylko poczytaj o tym, ja należy taki twór w c++ stworzyć (RAII, zasada 3/5, jak zrobić iteratory...) Ja tam dalej obstawiam, że vector Ci wystarczy;-> pzdr bartekltg
Re: Jeszcze sprytne wskaźniki
Author: bartekltg
Date: Sun, 09 Oct 2016 23:52
Date: Sun, 09 Oct 2016 23:52
46 lines
2841 bytes
2841 bytes
On 10.10.2016 00:59, Borneq wrote: > W dniu 10.10.2016 o 00:53, Borneq pisze: >> Raw pointer - nie trzeba wydobywać, gdy jest znany przed konstrukcją >> unique_ptr > > Dokładnie opisałem zapytanie na forum: > https://social.msdn.microsoft.com/Forums/vstudio/en-US/3421bad8-9236-4ab4-9551-0555dab1dd9e/how-distinguish-between-objects-and-temporary-objects?forum=vcgeneral No popatrz, taką samą odpowiedź dostałeś tutaj w sobotę ;-) 1. Użyj vector. 2. Użyj boost::small_vector<typ, wielkość_statycznego_bufora> jeśli naprawdę chcesz optymalizacji dla zawartośći <stała. small_vector<int,3> jest dokałdnie tym, co opisujesz. Do 3 elementów trzyma statycznie, ponad 3 trzyma w pamięci alokowanej dynamicznie. 3. To, co w tym linku proponujesz, czyli wystawianie gołego wskaźnika do tablicy dynamicznej lub statycznej wcale wiele wydajności nie podniesie (poprawi ulożenie w cache, reszta jest identyczna), za to rozpuchnie Ci się sam obiekt! Do tego jest niekoszerne. Sprzedasz komuś ten wskaźnik, on go sobie zachowa; dodasz coś do obiekty, przealokujesz pamieć, a wskaźnik nadal pokazuje tam gdzie pokazywał... ŚMIERĆ KUTAS I ZNISZCZENIE! Do tego trudne do zdebugowania*). pzdr bartekltg *) Iteratory domyślnie lepsze nie są, ale możęsz sobie w trybie debug dodatkową kontrolę włączyć, -D_GLIBCXX_DEBUG w g++ #define _ITERATOR_DEBUG_LEVEL 1 w vc http://stackoverflow.com/questions/6378550/assertion-fails-exceptions-for-stl No i iteratora nikt nie wyprowadza sobie na spacer do innych obiektów, w wskaźnik - kto wie ;-)
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Mon, 10 Oct 2016 00:28
Date: Mon, 10 Oct 2016 00:28
4 lines
1451 bytes
1451 bytes
W dniu 10.10.2016 o 01:25, bartekltg pisze: > od u-ptr chcesz dziwnych rzeczy, boostowe vectroy też Boostowe może dobre, ale może, bo nie wiem czy coś źle zrobiłem czy też ten static_vector jest cały statyczny czy ma tylko jakąś stałą część?
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Mon, 10 Oct 2016 00:41
Date: Mon, 10 Oct 2016 00:41
41 lines
2694 bytes
2694 bytes
W dniu 10.10.2016 o 01:52, bartekltg pisze:
> 2. Użyj boost::small_vector<typ, wielkość_statycznego_bufora> jeśli
> naprawdę chcesz optymalizacji dla zawartośći <stała.
>
> small_vector<int,3> jest dokałdnie tym, co opisujesz.
> Do 3 elementów trzyma statycznie, ponad 3 trzyma w pamięci
> alokowanej dynamicznie.
A więc small_vector! Myślałem początkowo że tą funkcjonalność daje
static_vector a small_vector jest dla małych wektorów. Ja chcę używać
dużych wielkości danych a tylko zoptymalizować dla małych.
Czyli small_vector załatwia pierwszą część,
Teraz
class SampleNum
{
private:
bool tmp = false;
W C++ private są widoczne z innych obiektów tej klasy, w odróżnieniu
zdaje się od Javy gdzie widać tylko z tego obiektu.
Więc
SampleNum SampleNum::operator+(const SampleNum & v)
{
SampleNum tmp(data[0]+v.data[0]);
tmp.tmp = true;
return tmp;
}
A w operatorze
SampleNum& SampleNum::operator=(const SampleNum& v)
{
data = v.data;
return *this;
}
data = v.data (gdzie data teraz small_vector) chyba nie rozróżnia, czy v
jest tymczasowym i zawsze będzie klonować. Potrzeba by była
przeniesienia wskaźnika, ale najważniejsze, to small_vector
------------------------
small_vector jest świetny, nawet dla parametru 0 przyśpieszył i to dużo!
podczas gdy ja dla tego parametru patrzyłem ile zwolni. Ale dla
parametru = 10 jeszcze bardziej.
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Mon, 10 Oct 2016 00:59
Date: Mon, 10 Oct 2016 00:59
9 lines
1701 bytes
1701 bytes
W dniu 10.10.2016 o 02:41, Borneq pisze: > private: > bool tmp = false; Zamiast tego może Move assignment operator: http://en.cppreference.com/w/cpp/language/move_assignment http://en.cppreference.com/w/cpp/language/move_constructor Choć nie wiem jak użyć: move_assignment użyłem i wtedy w operator+ nie mogę zwrócić tmp. To było by bardziej eleganckie rozwiązanie niż flaga tmp.
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Mon, 10 Oct 2016 02:14
Date: Mon, 10 Oct 2016 02:14
28 lines
2250 bytes
2250 bytes
W dniu 10.10.2016 o 02:59, Borneq pisze:
> W dniu 10.10.2016 o 02:41, Borneq pisze:
>> private:
>> bool tmp = false;
>
> Zamiast tego może Move assignment operator:
> http://en.cppreference.com/w/cpp/language/move_assignment
> http://en.cppreference.com/w/cpp/language/move_constructor
> Choć nie wiem jak użyć: move_assignment użyłem i wtedy w operator+ nie
> mogę zwrócić tmp. To było by bardziej eleganckie rozwiązanie niż flaga tmp.
>
Jakoś nie użyłem, zamiast tego:
SampleNum& SampleNum::operator=(const SampleNum& v)
{
if (v.tmp)
{
std::move(v);
printf("tmp=%d\n", tmp);//czemu tu pisze żę tmp=false ?
}
else
{
data = v.data;
}
return *this;
}
naprawdę przyśpieszyło! tylko czemu to printf wypisuje że tmp = false,
mimo że obiekt ma być przeniesiony z v? może std::move przenosi tylko
obiekty a nie zwykłe pola? Jakoś nie ma analogicznego std::copy()
Re: Jeszcze sprytne wskaźniki
Author: bartekltg
Date: Mon, 10 Oct 2016 17:33
Date: Mon, 10 Oct 2016 17:33
53 lines
3012 bytes
3012 bytes
On 10.10.2016 02:41, Borneq wrote:
> W dniu 10.10.2016 o 01:52, bartekltg pisze:
>> 2. Użyj boost::small_vector<typ, wielkość_statycznego_bufora> jeśli
>> naprawdę chcesz optymalizacji dla zawartośći <stała.
>>
>> small_vector<int,3> jest dokałdnie tym, co opisujesz.
>> Do 3 elementów trzyma statycznie, ponad 3 trzyma w pamięci
>> alokowanej dynamicznie.
>
> A więc small_vector! Myślałem początkowo że tą funkcjonalność daje
> static_vector a small_vector jest dla małych wektorów. Ja chcę używać
> dużych wielkości danych a tylko zoptymalizować dla małych.
> Czyli small_vector załatwia pierwszą część,
> Teraz
> class SampleNum
> {
> private:
> bool tmp = false;
>
> W C++ private są widoczne z innych obiektów tej klasy, w odróżnieniu
> zdaje się od Javy gdzie widać tylko z tego obiektu.
> Więc
> SampleNum SampleNum::operator+(const SampleNum & v)
> {
> SampleNum tmp(data[0]+v.data[0]);
> tmp.tmp = true;
> return tmp;
> }
> A w operatorze
> SampleNum& SampleNum::operator=(const SampleNum& v)
> {
> data = v.data;
> return *this;
> }
>
> data = v.data (gdzie data teraz small_vector) chyba nie rozróżnia, czy v
> jest tymczasowym i zawsze będzie klonować. Potrzeba by była
> przeniesienia wskaźnika, ale najważniejsze, to small_vector
Na moje, to bym znów powtórzył:
nie rób tego. Spróbuj prawprojektować
program tak,a by nie musieć oddawać gołych wskaźników.
> small_vector jest świetny, nawet dla parametru 0 przyśpieszył i to dużo!
> podczas gdy ja dla tego parametru patrzyłem ile zwolni. Ale dla
> parametru = 10 jeszcze bardziej.
;-)
pzdr
bartekltg
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Mon, 10 Oct 2016 21:36
Date: Mon, 10 Oct 2016 21:36
8 lines
1643 bytes
1643 bytes
W dniu 10.10.2016 o 19:33, bartekltg pisze: > Na moje, to bym znów powtórzył: > nie rób tego. Spróbuj prawprojektować > program tak,a by nie musieć oddawać gołych wskaźników. przeprojektowałem, używa small_vector a w operatorze przypisania dla tymczasowego używam data = std::move(v.data);
Re: Jeszcze sprytne wskaźniki
Author: bartekltg
Date: Mon, 10 Oct 2016 21:38
Date: Mon, 10 Oct 2016 21:38
14 lines
1752 bytes
1752 bytes
On 10.10.2016 23:36, Borneq wrote: > W dniu 10.10.2016 o 19:33, bartekltg pisze: >> Na moje, to bym znów powtórzył: >> nie rób tego. Spróbuj prawprojektować >> program tak,a by nie musieć oddawać gołych wskaźników. > > przeprojektowałem, używa small_vector a w operatorze przypisania dla > tymczasowego używam > data = std::move(v.data); Po co?! pzdr bartekltg
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Mon, 10 Oct 2016 22:22
Date: Mon, 10 Oct 2016 22:22
10 lines
1748 bytes
1748 bytes
W dniu 10.10.2016 o 23:38, bartekltg pisze: >> przeprojektowałem, używa small_vector a w operatorze przypisania dla >> tymczasowego używam >> data = std::move(v.data); > > Po co?! Aby zabierał wskaźnik i działa. Chyba jest jeszcze inne rozwiązanie z operatorem przenoszenia i konstruktorem przenoszenia ale u mnie nie działają.
Re: Jeszcze sprytne wskaźniki
Author: M.M.
Date: Tue, 11 Oct 2016 12:08
Date: Tue, 11 Oct 2016 12:08
16 lines
2352 bytes
2352 bytes
On Tuesday, October 11, 2016 at 12:22:12 AM UTC+2, Borneq wrote: > W dniu 10.10.2016 o 23:38, bartekltg pisze: > >> przeprojektowałem, używa small_vector a w operatorze przypisania dla > >> tymczasowego używam > >> data = std::move(v.data); > > > > Po co?! > > Aby zabierał wskaźnik i działa. Chyba jest jeszcze inne rozwiązanie z > operatorem przenoszenia i konstruktorem przenoszenia ale u mnie nie > działają. Ile program przyspieszył? - Rozumiem, że utrudniasz sobie pracę w celu poprawienia wydajności. Pozdrawiam
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Tue, 11 Oct 2016 15:38
Date: Tue, 11 Oct 2016 15:38
7 lines
1877 bytes
1877 bytes
W dniu 11.10.2016 o 14:08, M.M. pisze: > Ile program przyspieszył? - Rozumiem, że utrudniasz sobie pracę w > celu poprawienia wydajności. Zrobiłem testowy program który działał na dużych buforach rzędu miliona elementów i zabieranie wskaźnika zamiast kopiowania przyśpieszyło dwukrotnie. Połowa czasu było zapełnianie bufora, druga - jego kopiowanie.
Re: Jeszcze sprytne wskaźniki
Author: bartekltg
Date: Tue, 11 Oct 2016 15:44
Date: Tue, 11 Oct 2016 15:44
27 lines
2129 bytes
2129 bytes
On 11.10.2016 00:22, Borneq wrote: > W dniu 10.10.2016 o 23:38, bartekltg pisze: >>> przeprojektowałem, używa small_vector a w operatorze przypisania dla >>> tymczasowego używam >>> data = std::move(v.data); >> >> Po co?! > > Aby zabierał wskaźnik i działa. To jest jak. A ja pytałem sie po co? Jeśli chces,z by nie realokować i nie kopiować pamieci przy przenoszeniu z obeiktów tymczasowych, to do działą z buta, jeśli masz jako pole kontener posiadający operator przenoszący. > Chyba jest jeszcze inne rozwiązanie z > operatorem przenoszenia i konstruktorem przenoszenia ale u mnie nie > działają. "Dziwne, u mnie działa" ;-) pzdr bartekltg
Re: Jeszcze sprytne wskaźniki
Author: bartekltg
Date: Tue, 11 Oct 2016 15:45
Date: Tue, 11 Oct 2016 15:45
13 lines
1932 bytes
1932 bytes
On 11.10.2016 17:38, Borneq wrote: > W dniu 11.10.2016 o 14:08, M.M. pisze: >> Ile program przyspieszył? - Rozumiem, że utrudniasz sobie pracę w >> celu poprawienia wydajności. > > Zrobiłem testowy program który działał na dużych buforach rzędu miliona > elementów i zabieranie wskaźnika zamiast kopiowania przyśpieszyło > dwukrotnie. Względem czego? pzdr bartekltg
Re: Jeszcze sprytne wskaźniki
Author: M.M.
Date: Tue, 11 Oct 2016 19:35
Date: Tue, 11 Oct 2016 19:35
14 lines
2548 bytes
2548 bytes
On Tuesday, October 11, 2016 at 5:38:57 PM UTC+2, Borneq wrote: > W dniu 11.10.2016 o 14:08, M.M. pisze: > > Ile program przyspieszył? - Rozumiem, że utrudniasz sobie pracę w > > celu poprawienia wydajności. > > Zrobiłem testowy program który działał na dużych buforach rzędu miliona > elementów i zabieranie wskaźnika zamiast kopiowania przyśpieszyło > dwukrotnie. Połowa czasu było zapełnianie bufora, druga - jego kopiowanie. Ok, ale Bartek ma rację, że vektor nawet bez konstruktora przenoszącego kopiuje tylko wskaźnik a nie robi głębokiej kopii. Wniosek: przyspieszyło z jakiegoś innego powodu. Pozdrawiam
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Tue, 11 Oct 2016 22:06
Date: Tue, 11 Oct 2016 22:06
7 lines
1891 bytes
1891 bytes
W dniu 11.10.2016 o 21:35, M.M. pisze: > Ok, ale Bartek ma rację, że vektor nawet bez konstruktora przenoszącego > kopiuje tylko wskaźnik a nie robi głębokiej kopii. Wniosek: przyspieszyło z > jakiegoś innego powodu. Nie robi kopii? a data = right.data , gdzie data vector?
Re: Jeszcze sprytne wskaźniki
Author: Borneq
Date: Tue, 11 Oct 2016 22:06
Date: Tue, 11 Oct 2016 22:06
8 lines
1706 bytes
1706 bytes
W dniu 11.10.2016 o 17:44, bartekltg pisze: >> Chyba jest jeszcze inne rozwiązanie z >> operatorem przenoszenia i konstruktorem przenoszenia ale u mnie nie >> działają. > > "Dziwne, u mnie działa" Możesz wrzucić kod tych operatorów?
Re: Jeszcze sprytne wskaźniki
Author: M.M.
Date: Wed, 12 Oct 2016 02:28
Date: Wed, 12 Oct 2016 02:28
21 lines
2803 bytes
2803 bytes
On Wednesday, October 12, 2016 at 12:06:08 AM UTC+2, Borneq wrote: > W dniu 11.10.2016 o 21:35, M.M. pisze: > > Ok, ale Bartek ma rację, że vektor nawet bez konstruktora przenoszącego > > kopiuje tylko wskaźnik a nie robi głębokiej kopii. Wniosek: przyspieszyło z > > jakiegoś innego powodu. > > Nie robi kopii? > a data = right.data , gdzie data vector? Konstruktor przenoszący nie robi kopii danych. Powyżej jednak używasz operatora przypisania - to zależy od implementacji. Implementacja może poczekać do chwili modyfikacji danych, kiedyś mi się obiło o uszy, że tak robi QVector - ale w dokumentacji nic nie widzę na ten temat. Wracając, w przypadku użycia operatora przypisania, może wystarczy referencja? const vector &x = other; W przypadku referencji żadna implementacja nie zrobi głębokiej kopii. Pozdrawiam
Re: Jeszcze sprytne wskaźniki
Author: Przemek Biernat
Date: Mon, 05 Dec 2016 17:08
Date: Mon, 05 Dec 2016 17:08
26 lines
2936 bytes
2936 bytes
On Sunday, October 9, 2016 at 8:55:47 PM UTC+2, Borneq wrote: > W Wikipedii: https://en.wikipedia.org/wiki/Smart_pointer > std::unique_ptr<int> p1(new int(5)); > std::unique_ptr<int> p2 = p1; //Compile error. > std::unique_ptr<int> p3 = std::move(p1); //Transfers ownership. p3 now > owns the memory and p1 is rendered invalid. > > p3.reset(); //Deletes the memory. > p1.reset(); //Does nothing. > > new int(5) znaczy to samo co new int[5] - tablica ? > ale ani w debugerze ani w kodzie nie mogę dostać się do elementu [i] > bardzo dobra sprawa że przypisanie zostaje już wyeliminowane w procesie > kompilacji > p1.reset() w destruktorze? a może automatycznie destruktor to wykona? > Jest std::move(p1) a nie ma std::copy(p1), czasem jednak chcielibyśmy > wykonać kopię danych, wtedy > std::unique_ptr<int> p2(new int(5)); > i pętla for? a może memcpy ale czy zadziała? > Jak za pomocą unique_ptr wykonać coś takiego że gdy mamy operator typu * > czy + tworzące obiekt tymczasowy oraz operator przypisania, to > przypisze mi w kodzie z elementu tymczasowego, przypisywanie do > tymczasowego nie zabierze czasu i będzie można go spokojnie skasować, > kasowanie tymczasowego nie skasuje danych? Przestałem uzywać smart pointerów. Używam kontenerów z przełącznikiem owner, a jak chce coś skopiować to na obiektach mam zaimplementowane clone. Kontener owner usuwa to co posiada a nie owner nie usuwa i zostawia do usunięcia ownerowi. Pojedyncze wskaźniki usuwam ręcznie w destruktorach i użuwam ich jako elementy klas. Pojedyczne wskaźniki tworzone w funkcjach pakuje do kontenerów zwykle owner bo inaczej wyciek.
Re: Jeszcze sprytne wskaźniki
Author: Wojciech Muła
Date: Sun, 11 Dec 2016 18:12
Date: Sun, 11 Dec 2016 18:12
14 lines
1981 bytes
1981 bytes
On Monday, December 5, 2016 at 6:08:58 PM UTC+1, Przemek Biernat wrote: > Pojedyncze wskaźniki usuwam ręcznie > w destruktorach i użuwam ich jako elementy klas. Chce Ci się? Szablon unique_ptr daje to za darmo, nie zapomnisz o zwolnieniu. A jak sobie napiszesz własny "deleter", to inne zasoby też możesz automatycznie sprzątać. > Pojedyczne wskaźniki tworzone w funkcjach pakuje do kontenerów > zwykle owner bo inaczej wyciek. To są jakieś Twoje kontenery? w.
Re: Jeszcze sprytne wskaźniki
Author: Przemek Biernat
Date: Sun, 18 Dec 2016 16:23
Date: Sun, 18 Dec 2016 16:23
17 lines
2261 bytes
2261 bytes
On Sunday, December 11, 2016 at 7:12:49 PM UTC+1, Wojciech Muła wrote: > On Monday, December 5, 2016 at 6:08:58 PM UTC+1, Przemek Biernat wrote: > > Pojedyncze wskaźniki usuwam ręcznie > > w destruktorach i użuwam ich jako elementy klas. > > Chce Ci się? Szablon unique_ptr daje to za darmo, nie zapomnisz > o zwolnieniu. A jak sobie napiszesz własny "deleter", to inne > zasoby też możesz automatycznie sprzątać. > > > Pojedyczne wskaźniki tworzone w funkcjach pakuje do kontenerów > > zwykle owner bo inaczej wyciek. > > To są jakieś Twoje kontenery? > > w. No są ale chyba już każdy je ma. No chyba że ktoś chciałby kupić, ale to jeszcze za wcześnie jest, kontenery działają ale reszta jeszcze nie. Generalnie koduję bez STL wszystko robię sam poza dostępem do socketów, dysku, wątków tutaj korzystam w WinApi.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads