Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Utworzenie nowego stringu w zaczynającego się pod określonym adresem i o określonej długości.

Ostatnio zmodyfikowano 2022-06-03 20:56
Autor Wiadomość
Masterofironfist
Temat założony przez niniejszego użytkownika
Utworzenie nowego stringu w zaczynającego się pod określonym adresem i o określonej długości.
» 2022-06-03 14:22:19
C/C++
char * buffer = new char[ 5120 ]; //poza główną pętlą programu;
for( int i = 0; i < 5120; ++i ) //rezerwujemy miejsce;
   
 * buffer[ i ] = '\0'; //I wypełniamy zerami aby pozbyć się śmieci;


void draw( char * buffer, some other arguments )
{
   
string * forPrint = new( buffer ) string;
   
forPrint->reserve( 5100 );
   
for()
   
{
       
for()
       
{
           
//Jakies operacje dodawania elementów do stringu
       
}
    }
   
printf( "%s", forPrint->c_str() ); //przygotowany string odrazu po przygotwoaniu wypisujemy do konsoli;
}


delete[ ] buffer; //na końcu za główną pętla programu;
buffer = nullptr; //zwalniamy miejsce;
Witam mam takie pytanie odnośnie stringu czy dało by się wymusić aby taki oto string znalazł się w zarezerowwanym miejscu z odrazu i odrazu jeszcze miał rezerwacje miejsca żeby nie ruszał się poza zarezerwowane miejsce
tablicą buffer, bo po sprawdzeniu adresu ostatniego elementu stringu widac że nie jest on w miejscu zarezerwowanym przez tablice buffer.
P-179490
DejaVu
» 2022-06-03 14:43:44
Jeżeli zaalokujesz raz pamięć i jej nie będziesz zwalniał to dane umieszczone będą dostępne zawsze pod tym samym adresem pamięci.
P-179491
Masterofironfist
Temat założony przez niniejszego użytkownika
» 2022-06-03 14:50:53
Czyli rozumiem zamiast alokowac ten bufor mam na początku programu poza jego pętlą główną poprostu zrobić string.reserve(5120) i po prostu wrzucać coś i wyrzucać z tego stringu aż do końca programu?
P-179492
pekfos
» 2022-06-03 18:58:03
Ten kod ma wyciek pamięci, bo tak utworzony string nie jest nigdy zniszczony.

Czyli rozumiem zamiast alokowac ten bufor mam na początku programu poza jego pętlą główną poprostu zrobić string.reserve(5120) i po prostu wrzucać coś i wyrzucać z tego stringu aż do końca programu?
reserve() jest zbędne. Jeśli używasz cały czas tego samego obiektu, ilość zarezerwowanej pamięci będzie rosnąć według potrzeb. Kilka realokacji w skali całego programu jest nieistotne i może nawet tańsze niż szacowanie pamięci z góry, jeśli nie jest stała. Jeśli nie chodzi o wydajność, tylko konkretnie stały adres, std::string nie jest właściwym wyborem.
P-179493
Masterofironfist
Temat założony przez niniejszego użytkownika
» 2022-06-03 20:56:52
1. mogę użyć string Reserve nieco bardziej precyzyjnie bo wiem dokładnie jak dużo pamięci  mi potrzeba rozmiar planszy gry + wszystkich komunikatów do wyświetlenia.
2. Ten program poprzedni był błędny bo niepotrzebnie zabrałem się za tą rezerwacje poprzez char * zamiast odrazu string.reserve().
3. Ten string jest mi potrzebny do wyświetlenia planszy gry żeby wszystko za 1 wywołaniem funkcji printf () wyświetlić dzięki czemu program zaczął pracować ponad 2 razy szybciej co jest dużym plusem jak jeszcze nad tym programem podłubie może jeszcze trochę wydajności zyskam.
P-179494
« 1 »
  Strona 1 z 1