Jakub L.

Jakub L. Programista

Temat: Problem z dynamicznym przydzielaniem pamięci w prostym...

Tomasz Krzal:
Patrzycie na wydajność kodu? a++ lub ++a? Rozwijanie pętli? Autowektoryzacja?Bo z tego, co się orientuję, to dziś optymalizacja wydajności kodu w obliczu gigaherców, ma się źle. Widzi mi się, że dziś ważniejsze jest dotrzymanie terminów niż szybkość kodu. Np. gra MUSI się ukazać przed świętami Bożego Narodzenia. Chodzi wolno? Kupcie sobie Szanowni Klienci lepszy sprzęt!

Szczególnie jak się dłubie w embeded na 200 MHz :)
Jak potrzeba szybko i sprzęt nie gra roli, to Java.
Piotr B.

Piotr B. development engineer

Temat: Problem z dynamicznym przydzielaniem pamięci w prostym...

Jakub L.:
Tomasz Krzal:
świętami Bożego Narodzenia. Chodzi wolno? Kupcie sobie Szanowni Klienci lepszy sprzęt!

Szczególnie jak się dłubie w embeded na 200 MHz :)

O to to... Osobiście też trochę, czasami piszę pod systemy embedded i cóż... optymalizacja jednak potrzebna ;)

A zresztą... prowadzę taki jeden projekt open source, który ma takie zapotrzebowanie zarówno na RAM, jak i na moc CPU, że połowę procedur napisałem w assemblerze, inaczej na efekty działania programu można by czekać dniami.

Wniosek: wszystko zależy od konkretnego zadania... nie można generalizować.

konto usunięte

Temat: Problem z dynamicznym przydzielaniem pamięci w prostym...

Piotr Borys:

Wniosek: wszystko zależy od konkretnego zadania... nie można generalizować.

Powiedziałbym raczej, że nie powinno się za dużo generalizować. Spójrzmy tylko na Windowsy na przestrzeni 20 lat. Pierwszy Windows spokojnie poszedłby na procku embedded 200MHz (pomijając niepasującą listę instrukcji). Systemy embedded (lub podobne) w połowie lat dziewięćdziesiątych (czyli wtedy, kiedy ostatni raz miałem z nimi do czynienia) były oprogramowane w tak skromnym asemblerze, że nie było potrzeby robić je nawet w uproszczonym C. A nawet nie dało się tak robić. Po prostu każdy bit był wtedy liczony i każdy herc. Teraz też się podobnie dzieje ale z jednym i DUŻYM 'ale'. Dzisiejszy sprzęt w niektórych pralkach, mikrofalówkach i lodówkach może obsługiwać TCP/IPv6. Te wspomniane 200MHz mnie by zabiły w tych czasach. Wtedy robiłem na paru megahercach :)
I to jest to, o czym mówię: dzisiejszy sprzęt zabija wrażliwego technicznie człowieka swoimi osiągami i chodzi wolniej niż wtedy :))))))))
Piotr B.

Piotr B. development engineer

Temat: Problem z dynamicznym przydzielaniem pamięci w prostym...

OK, masz rację.... nikt już się nie gimnastykuje tak, jak wówczas. Już chyba nawet nie umiemy?... jak mówisz, technologia zabiła to "coś" ;)
Piotr P.

Piotr P. Software Developer

Temat: Problem z dynamicznym przydzielaniem pamięci w prostym...

Piotr P.:
Juz od jakiegos czasu uwazam, ze najbardziej zaniedbanym narzedziem jest linker (chocby problemy z bibliotekami).

Rozwiń myśl :)

konto usunięte

Temat: Problem z dynamicznym przydzielaniem pamięci w prostym...

Piotr Borys:
OK, masz rację.... nikt już się nie gimnastykuje tak, jak wówczas. Już chyba nawet nie umiemy?... jak mówisz, technologia zabiła to "coś" ;)

Poprogramuj sobie w domenie GPGPU. Tam nadal trzeba liczyć bajty, za to projekty bardziej ambitne niż oprogramowanie pralki...

:)

konto usunięte

Temat: Problem z dynamicznym przydzielaniem pamięci w prostym...

hej;)
podepne sie pod ten watek - mam taki problem:
mam 2 zmienne globalne

user_struct** p_user_list;
user_struct user;


no i wydawalo mi sie ze prosty kod:

int count = get_user_count();
p_user_list = realloc(p_user_list, count * sizeof(user_struct*) + 2);
if (p_user_list == NULL)
return -1;

p_user_list[count] = malloc(sizeof(user_struct));
if (p_user_list[count] == NULL)
return -1;
memcpy(p_user_list[count], &user, sizeof(user_struct));
p_user_list[count + 1] = NULL; //ostatni element jest NULLem zeby mozna bylo zliczyc liczbe elementow w tablicy


problem polega na tym ze na mojej maszynie zawsze po czwartym wywolaniu tego fragmentu kodu wyskakuje mi mniej wiecej cos takiego razem z calym stack tracem:
*** glibc detected *** ./server: realloc(): invalid next size: 0x0000000000607390 ***

ktos ma jakis pomysl o co moze chodzic?

konto usunięte

Temat: Problem z dynamicznym przydzielaniem pamięci w prostym...

fuck, mecze sie nad tym z godzinke a oczywiscie sam na to wpadlem chwile po zamieszczeniu posta - zamiast
p_user_list = realloc(p_user_list, count * sizeof(user_struct*) + 2);
powinno byc
p_user_list = realloc(p_user_list, (count + 2) * sizeof(user_struct*));

porazka:D

konto usunięte

Temat: Problem z dynamicznym przydzielaniem pamięci w prostym...

hmm... a dlaczego sizeof(user_struct*)? To przypadkiem nie to samo co sizeof(user_struct)? Tak z ciekawości pytam :-)

EDIT: Nieważne... proszę zignorować to pytanie :-)Krzysztof Kondrak edytował(a) ten post dnia 02.11.08 o godzinie 00:31
Artur Kęska

Artur Kęska Senior Software
Developer, XNet
Communications

Temat: Problem z dynamicznym przydzielaniem pamięci w prostym...

Panowie, od początku:
Panie Krzysztofie sizeof(coś*) daje dla danej architektury procesora zawsze to samo (na 32 bitowych maszynach zawsze 4)
sizeof(strktura) zwraca ilość bajtów zajmowanych przez strukturę - więc to nie to samo.

Co do kodu Pana Kuby:
Domyślam się że procedura ma dodawać element na końcu listy (taka samo rozszerzająca się tablica).
Przyznam się, że nie rozumiem do końca znaczenia wielkości allokowanej pamięci, ale wydaje mi się, że poprawnie powinno być:

p_user_list = realloc(p_user_list, (count+2) * sizeof(user_struct*));

Nie wiem też co właściwie zwraca:

int count = get_user_count();

założyłem więc, że jest to bieżąca (przed dodaniem nowego elementu) ilość elementów w tablicy.

Poprawka którą Pan zrobił pomogła ponieważ wielkość struktury user_struct jest większa niż rozmiar potrzebny do przechowywania wskaźnika. Dzięki temu allokowana jest wystarczająca ilość pamięci (a nawet na pewno allokowane jest za dużo), toteż program sobie radzi, tylko chyba nie o to chodziło.
Tomasz Kaczanowski

Tomasz Kaczanowski Ot, programista

Temat: Problem z dynamicznym przydzielaniem pamięci w prostym...

Artur Kęska:
Panowie, od początku:
Panie Krzysztofie sizeof(coś*) daje dla danej architektury procesora zawsze to samo (na 32 bitowych maszynach zawsze 4)
sizeof(strktura) zwraca ilość bajtów zajmowanych przez strukturę - więc to nie to samo.

Nie tylko architektura procesora jest istotna, ale i system...
Piotr B.

Piotr B. development engineer

Temat: Problem z dynamicznym przydzielaniem pamięci w prostym...

a jakby tak zacząć wnikać, to i model programu... czy wskaźniki będą bliskie, czy dalekie...

konto usunięte

Temat: Problem z dynamicznym przydzielaniem pamięci w prostym...

Artur Kęska:
Panowie, od początku:
Panie Krzysztofie sizeof(coś*) daje dla danej architektury procesora zawsze to samo (na 32 bitowych maszynach zawsze 4)
sizeof(strktura) zwraca ilość bajtów zajmowanych przez strukturę - więc to nie to samo.
>

Zorientowałem się już po zadaniu pytania, stąd też prosiłem o zignorowanie. :-)

Następna dyskusja:

[zagadka] scalenie w czasie...




Wyślij zaproszenie do