🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.c
33 messages
33 total messages Started by Borneq Sun, 09 Oct 2016 18:55
Jeszcze sprytne wskaźniki
#308853
Author: Borneq
Date: Sun, 09 Oct 2016 18:55
23 lines
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
#308854
Author: Borneq
Date: Sun, 09 Oct 2016 19:18
8 lines
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
#308855
Author: bartekltg
Date: Sun, 09 Oct 2016 20:16
51 lines
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
#308856
Author: Borneq
Date: Sun, 09 Oct 2016 20:45
8 lines
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
#308857
Author: Borneq
Date: Sun, 09 Oct 2016 20:50
15 lines
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
#308858
Author: Borneq
Date: Sun, 09 Oct 2016 20:53
6 lines
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
#308859
Author: Borneq
Date: Sun, 09 Oct 2016 21:11
45 lines
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
#308860
Author: bartekltg
Date: Sun, 09 Oct 2016 21:32
25 lines
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
#308861
Author: Borneq
Date: Sun, 09 Oct 2016 21:48
33 lines
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
#308862
Author: Borneq
Date: Sun, 09 Oct 2016 21:55
11 lines
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
#308863
Author: Borneq
Date: Sun, 09 Oct 2016 22:53
10 lines
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
#308864
Author: Borneq
Date: Sun, 09 Oct 2016 22:59
6 lines
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
#308881
Author: bartekltg
Date: Sun, 09 Oct 2016 23:25
33 lines
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
#308865
Author: bartekltg
Date: Sun, 09 Oct 2016 23:52
46 lines
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
#308882
Author: Borneq
Date: Mon, 10 Oct 2016 00:28
4 lines
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
#308866
Author: Borneq
Date: Mon, 10 Oct 2016 00:41
41 lines
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
#308867
Author: Borneq
Date: Mon, 10 Oct 2016 00:59
9 lines
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
#308868
Author: Borneq
Date: Mon, 10 Oct 2016 02:14
28 lines
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
#308869
Author: bartekltg
Date: Mon, 10 Oct 2016 17:33
53 lines
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
#308870
Author: Borneq
Date: Mon, 10 Oct 2016 21:36
8 lines
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
#308871
Author: bartekltg
Date: Mon, 10 Oct 2016 21:38
14 lines
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
#308872
Author: Borneq
Date: Mon, 10 Oct 2016 22:22
10 lines
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
#308873
Author: M.M.
Date: Tue, 11 Oct 2016 12:08
16 lines
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
#308874
Author: Borneq
Date: Tue, 11 Oct 2016 15:38
7 lines
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
#308879
Author: bartekltg
Date: Tue, 11 Oct 2016 15:44
27 lines
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
#308878
Author: bartekltg
Date: Tue, 11 Oct 2016 15:45
13 lines
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
#308875
Author: M.M.
Date: Tue, 11 Oct 2016 19:35
14 lines
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
#308876
Author: Borneq
Date: Tue, 11 Oct 2016 22:06
7 lines
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
#308880
Author: Borneq
Date: Tue, 11 Oct 2016 22:06
8 lines
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
#308877
Author: M.M.
Date: Wed, 12 Oct 2016 02:28
21 lines
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
#308883
Author: Przemek Biernat
Date: Mon, 05 Dec 2016 17:08
26 lines
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
#308884
Author: Wojciech Muła
Date: Sun, 11 Dec 2016 18:12
14 lines
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
#308885
Author: Przemek Biernat
Date: Sun, 18 Dec 2016 16:23
17 lines
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