Eigene memcpy Implementierung crasht
-
Und kürzer gehts auch noch (schöner ist es dadurch aber nicht):
for (char* char_dst = (char*)dst, *char_src = (char*)src; count--;) *char_dst++ = *char_src++;
-
Du hast ein * vergessen im Code SeppJ.
-
cooky451 schrieb:
Du hast ein * vergessen im Code SeppJ.
Ups! Danke! Das kommt davon, wenn man im Editfenster programmiert.
-
SeppJ schrieb:
Sone schrieb:
P.S.: Die casts die du da durchführst sind auch fragwürdig. Ich frag mich, ob das UB ist....
Die sollten in Ordnung sein. Was stört dich an denen? Oder ist das einfach dein anerzogener Beißreflex, wenn du einen C-Cast siehst?
Nein, nein. Ich meinte dieser Cast von
int*nachvoid*und dann nachchar*- ist das so vollkommen in Ordnung?
-
Sone schrieb:
SeppJ schrieb:
Sone schrieb:
P.S.: Die casts die du da durchführst sind auch fragwürdig. Ich frag mich, ob das UB ist....
Die sollten in Ordnung sein. Was stört dich an denen? Oder ist das einfach dein anerzogener Beißreflex, wenn du einen C-Cast siehst?
Nein, nein. Ich meinte dieser Cast von
int*nachvoid*und dann nachchar*- ist das so vollkommen in Ordnung?Warum sollte es das nicht sein?
-
Sone schrieb:
ist das so vollkommen in Ordnung?
Ja. Nach void* und char* darf immer gecastet werden.
-
Keine Ahnung. Ich habe einen Beißreflex auf Pointer-Casts. Das sieht mir einfach immer so eklig aus

-
Anders wäre memcpy sowieso nicht vernünftig implementierbar.
-
Sone schrieb:
Keine Ahnung. Ich habe einen Beißreflex auf Pointer-Casts. Das sieht mir einfach immer so eklig aus

Womit wir wieder beim Thema wären: einfach mal die Fresse halten wenn man nix zu sagen hat.
-
hustbaer schrieb:
Sone schrieb:
Keine Ahnung. Ich habe einen Beißreflex auf Pointer-Casts. Das sieht mir einfach immer so eklig aus

Womit wir wieder beim Thema wären: einfach mal die Fresse halten wenn man nix zu sagen hat.
Ähm... und was hat das mit mir zu tun? Ich hab' die Frage gestellt, ob das ein gültiger Cast ist. Ich habe die Antwort bekommen. Und du übertreibst wieder in alle Maßen? Was los bei dir?
-
Ab SSE2 empfehle ich folgendes.
void nontemporal_copy(char* outbuff, char* inbuff, int size) { const int step = 64; // cache line while(size > step) { _mm_prefetch(inbuff + 320, _MM_HINT_NTA); // non-temporal prefetch __m128i A = _mm_loadu_si128((__m128i*) (inbuff + 0)); __m128i B = _mm_loadu_si128((__m128i*) (inbuff + 16)); __m128i C = _mm_loadu_si128((__m128i*) (inbuff + 32)); __m128i D = _mm_loadu_si128((__m128i*) (inbuff + 48)); // destination address must be 16-byte aligned! _mm_stream_si128((__m128i*) (outbuff + 0), A); _mm_stream_si128((__m128i*) (outbuff + 16), B); _mm_stream_si128((__m128i*) (outbuff + 32), C); _mm_stream_si128((__m128i*) (outbuff + 48), D); inbuff += step; outbuff += step; size -= step; } _mm_mfence(); }