2010-09-19 7 views
1

j'ai deux rangées de caractères, répartis comme suit:copier plus petit tableau en tableau plus grand

unsigned char *arr1 = (unsigned char *)malloc((1024*1024) * sizeof(char)); 
unsigned char *arr2 = (unsigned char *)malloc((768*768) * sizeof(char)); 

Je souhaite copier arr2 en arr1, mais conserver la structure de ligne/colonne. Cela signifie que seuls les 768 premiers octets de chacune des 768 premières lignes seront modifiés dans arr1.

J'ai écrit une boucle for pour cela, mais ce n'est pas assez rapide pour mes besoins.

for (int x = 0; x < 768; x++) //copy each row 
{ 
    memcpy(arr1+(1024*x),arr2+(768*x), nc); 
} 

Existe-t-il une meilleure solution?

+2

'sizeof (char)' est, par définition, 1. Si vous voulez le sizeof là, utilisez 'sizeof * arr1'. – pmg

+0

Euh? sizeof * arr1 retournera juste 1. – zvrba

+0

@zvrba: à droite, mais au moins cela aura un sens et sera toujours valide si vous avez changé les types. Écrire 'sizeof (char)' ne vous protège pas contre les bogues si vous changez le type, et c'est 100% inutile dans tous les cas parce que 'sizeof (char) == 1' fait partie de la ** définition ** du' sizeof 'opérateur. –

Répondre

4

peut-être se débarrasser des multiplications

size_t bigindex = 0, smallindex = 0; 
for (int x = 0; x < 768; x++) //copy each row 
{ 
    memcpy(arr1 + bigindex, arr2 + smallindex, nc); 
    bigindex += 1024; 
    smallindex += 768; 
} 

Modifier d'oh! utilise les pointeurs!

unsigned char *a1 = arr1; 
unsigned char *a2 = arr2; 
for (int x = 0; x < 768; x++) //copy each row 
{ 
    memcpy(a1, a2, nc); 
    a1 += 1024; 
    a2 += 768; 
} 
+0

Merci, cela a fonctionné! Je n'avais pas réalisé que la multiplication le ralentirait. –

0

Que voulez-vous dire par pas assez rapide? L'avez-vous comparé?

Je suppose que votre nc est juste une constante nommée pour 768?

Il n'y a pas grand-chose qui ira plus vite si vous utilisez memcpy intégré que votre compilateur fournit. Les problèmes qui pourraient être en vigueur dans votre démarche:

  • des problèmes d'alignement
  • votre constante nc ne pas être un temps de compilation constante
  • vous n'avez pas le compilateur correct drapeaux
1

Plutôt que de copier tout le contenu, peut-être d'abord allouer cela comme 768 tableaux séparés, puis utiliser realloc pour les étendre au lieu de copier?

Vous ne savez pas si cela fait vraiment gagner du temps à la fin d'avoir autant d'appels séparés à malloc() plutôt que la boucle de déplacement. Mais si vous devez copier plusieurs fois, cela pourrait être le cas. Il suppose également que vous ne voulez pas modifier davantage l'original ...

+0

+1 Nice side tracking :) ... mais 'realloc' va probablement devoir copier des données de toute façon – pmg

+0

Il y a une bonne possibilité, mais même éviter certaines copies pourrait suffire à améliorer les performances. Et, il aurait probablement évité les multiplications coûteuses qui étaient le vrai problème ... –

Questions connexes