[C++] Operacje na wskaźniku - kiedy standard określa niezdefiniowane zachowanie?
Ostatnio zmodyfikowano 2015-01-05 21:52
DejaVu |
» 2015-01-03 21:06:08 @Kaikso: Nie powołuj się na kompilatory bo to żaden argument. Kompilatory w wielu miejscach zachowują się znacznie lepiej niż standard przewiduje. Nie oznacza to jednak, że na innej, np. niszowej platformie przedstawiony przez Ciebie kod będzie miał niezdefiniowane zachowanie. Poza tym poniżej została napisana słuszna uwaga. |
|
SocrateZ |
» 2015-01-03 21:06:49 ponieważ wartość tekst - 1 zostanie obliczona podczas kompilacji |
Powiedz mi skąd kompilator podczas kompilacji będzie wiedział jaki adres w pamięci przydzieli program tablicy tekst? |
|
Kaikso |
» 2015-01-03 21:11:55 Powiedz mi skąd kompilator podczas kompilacji będzie wiedział jaki adres w pamięci przydzieli program tablicy tekst? |
Adresy są obliczane przez kompilator lub konsolidator. @DejaVu: systemy operacyjne muszą wykonywać takie operacje, aby sprawnie zarządzać pamięcią. Masz rację że kompilatory zachowują się o wiele lepiej niż przewiduje standard, właśnie dlatego lepiej korzystać ze standardów takich jak gnu99. |
|
DejaVu |
» 2015-01-03 21:16:44 Powiedz mi skąd kompilator podczas kompilacji będzie wiedział jaki adres w pamięci przydzieli program tablicy tekst? | Adresy są obliczane przez kompilator lub konsolidator.
|
Pod warunkiem, że są znane w trakcie kompilacji, a adres wskazanej zmiennej wyląduje na stosie, więc nie jest znany w czasie kompilacji. systemy operacyjne muszą wykonywać takie operacje, aby sprawnie zarządzać pamięcią. Masz rację że kompilatory zachowują się o wiele lepiej niż przewiduje standard, właśnie dlatego lepiej korzystać ze standardów takich jak gnu99.
|
A skąd wiesz czy ten kod nie będzie kompilowany np. na architekturze, której nie ma w obrocie publicznym i tym samym na kompilatorze, który opiera się strice o założenia standardu oraz na urządzeniu, które sprzętowo kontroluje poprawność adresowania pamięci, bo ma np. dedykowane instrukcje do przesuwania adresów pamięci i nie używa add/sub? |
|
SocrateZ |
» 2015-01-03 21:18:09 |
|
Kaikso |
» 2015-01-03 21:22:03 Poza tym można sprawdzić pod jakim kompilatorem jest kompilowany kod przy użyciu preprocesora, a dla niewspieranych kompilatorów #waring "The program may have undefined behavior" . I jak najczęściej unikać takich miejsc. @Up: Dlatego takie tematy są rozwijane aż problem zostanie rozwiązany ;) |
|
DejaVu |
» 2015-01-03 21:25:26 @Kaikso: jest cała masa rzeczy, która działa w określonych kompilatorach i zwraca zawsze określoną wartość, a mimo to jest to zachowanie opisane jako niezdefiniowane. Poza tym po co pisać kod, który ma niezdefiniowane zachowanie i robić 'warunki' na 'inne' kompilatory? Nie będziesz przeglądał miliona linii kodu w projekcie jeżeli będziesz chciał go przenieść na inną platformę. Kod ma być zgodny ze standardem, a nie zgodny z wizjami programisty 'bo u mnie działa'. Wyobraź sobie, że jest np. architektura, która ma instrukcje: pointer.set( numerek ); pointer.sub( 1 ); pointer.add( strlen( zmienna ) );
i teraz: RejestrX = numerek; RejestrY = 0; RejestrY = RejestrY - 1; RejestrY = RejestrY + strlen(zmienna); Adres = RejestrX + RejestrY; Wyjście poza wartość 0 dla RejestrY jest sprzętowym naruszeniem pamięci, a kompilator niszowej platformy wygenerował kod zgodnie z życzeniem programisty. |
|
Kaikso |
» 2015-01-03 21:27:30 @DejaVu: Czasami jest to praktyczniejsze rozwiązanie, jak np. w kodzie Linux-a. |
|
1 2 « 3 » 4 5 6 7 8 |