g++ 3.2, djvulibre i athlon

Jakub Bogusz qboosh w pld.org.pl
Śro, 4 Gru 2002, 00:16:59 CET


WRESZCIE namierzyłem byka. Tylko gdzie - w gcc, czy w djvulibre?

Ktoś chyba tutaj (malekith?) pisał, że C++ nie dopuszcza równoczesnego
istnienia wskaźników różnych typów do tej samej zmiennej i gcc 3.x
wykorzystuje to przy optymalizacji. Jakie są dokładne ograniczenia?

Czy taka konstrukcja jest poprawna (wycięta tylko istotna część):

#v+
class GPBufferBase
{
public:
  GPBufferBase(void *&,const size_t n,const size_t t);
private:
  void *&ptr;
};

inline
GPBufferBase::GPBufferBase(void *&xptr,const size_t n,const size_t t) : ptr(xptr), num(n)
{
  xptr=(n*t)?(::operator new(n*t)):0;
}

template<class TYPE>
class GPBuffer : public GPBufferBase
{
public:
  GPBuffer(TYPE *&xptr,const size_t n=0) : GPBufferBase((void *&)xptr,n,sizeof(TYPE)) {}
}
#v-

i dalej użycie:

#v+
  unsigned int *posn;
  GPBuffer<unsigned int> gposn(posn,blocksize);
  memset(posn, 0, sizeof(unsigned int)*size);
#v-      

Ten kod działa oprócz przypadku optymalizacji z "-O2 -march=athlon".

Kod dla np. "-O2 -march=i686" wygląda ~tak:

#v+
  leal 60(%esp),%esi
[...]
.Lxxx
  movl %eax,(%esi)
  leal 0(,%edx,4),%ecx
  movl 60(%esp),%edi
#v-

dla "-O2 -march=athlon":

#v+
  leal 60(%esp),%esi
[...]
.Lxxx
  movl 60(%esp),%edi
  leal 0(,%edx,4),%ecx
  movl %eax,(%esi)
#v-

Jak widać (%esi) i 60(%esp) to to samo słowo - w drugim przypadku
najpierw jest odczytywana wartość (jakiś śmieć?), potem dopiero
zapisywana... a że %edi jest potem używane jako adres do zerowania, to
zeruje to jakieś miejsce w pamięci (na podstawie efektów - struktury
dynamicznego linkera).


-- 
Jakub Bogusz    http://www.cs.net.pl/~qboosh/



Więcej informacji o liście dyskusyjnej pld-devel-pl