Memcpy [Résolu]

Messages postés
74
Date d'inscription
dimanche 14 octobre 2007
Statut
Membre
Dernière intervention
28 février 2011
- - Dernière réponse : cs_rt15
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
- 18 déc. 2010 à 13:17
Bonjour,

Je pose cette question ici, car je n'ai trouvé la réponse nul part ailleurs.

J'aurais voulu savoir si il était possible d'utiliser une fonction comme memcpy, memset, RtlCopyMemory ou autre fonction de manipulation de la mémoire sans utiliser de librairies << auxiliaires >> ni d'utiliser la MSVCRT.lib ou la LIBCMT.lib, tout ceci pour avant tout, des raisons de taille d'executables.

Car, l'executable sur lequel je travaille fait 9,50 ko avec la LIBCMT.lib, et 5,00 ko avec la MSVCRT.lib et le manifest.

Si quelqu'un avait une solution,

Merci d'avance.

LandTech
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
3
Merci
Tu ne pouvais pas adapter ???

__inline void myMEMCPY(void *pdst, void *psrc, DWORD n)
{
  BYTE *d, *s;
  d = (BYTE*) pdst;
  s = (BYTE*) psrc;
  do {
    *d++ = *s++;
  } while(--n);
}


NON, jamais d'ASM pour un si petit truc, en x64 ça empecherait toute optimisation du compilo vu que ça ne passerait plus en inline.

Je te laisse faire memset et memmove, c'est vraiment pas sorcier..

ciao...
BruNews, MVP VC++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 154 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BruNews
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015
0
Merci
pour memcpy, tu as CopyMemory
pour memset, tu as FillMemory

et toutes les autres sur msdn :http://msdn.microsoft.com/en-us/library/aa366781%28v=vs.85%29.aspx
Commenter la réponse de mogwai93
Messages postés
74
Date d'inscription
dimanche 14 octobre 2007
Statut
Membre
Dernière intervention
28 février 2011
0
Merci
Bonjour,

Justement, j'ai vérifié dans les headers de windows (précisément WinBase.h et WinNT.h) et en réalité CopyMemory est une simple défine de RltCopyMemory elle même define de memcpy et FillMemory et une défine de memset

J'avais utilisé ces fonctions avant de poster et je me suis rendu compte de ces defines.

Merci quand même.

Cordialement

LandTech

PS : voici les defines en question :

(WinBase.h)

#define CopyMemory RtlCopyMemory
#define FillMemory RtlFillMemory


et

(WinNT.h)

#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))
Commenter la réponse de LandTech
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
9.5 - 5 = 4.5 Ko

Si peu contre un énorme ralentissement, c'est le contraire de ce que l'on cherche en faisant du natif.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
14511
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 mai 2019
88
0
Merci
Hello,
LanTech, je trouve que tu pinailles un peu...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
Commenter la réponse de BunoCS
Messages postés
74
Date d'inscription
dimanche 14 octobre 2007
Statut
Membre
Dernière intervention
28 février 2011
0
Merci
Bonjour,

Je sais que 4.5 Ko ne vaut pas le coup de perdre en vitesse, mais en faite, si je pouvais me séparer de cette lib, je devrais tomber aux alentours de 3 Ko voir moins, ce qui serait parfait.

Or, pour cela, il faut que je trouve une fonction qui me permette de ne pas utiliser la lib, et je sèche.

buno -> je sais que je suis peut-être perfectionniste au Kilo-Octet près, mais je trouve que 9.5 Ko ou même 5 est énormee pour un programme qui fait si peut de chose. Surtout qu'il n'a pas de ressource.

Si quelqu'un avait une solution, SVP.

LandTech.

PS: je veut avoir un executable non compressé, donc inutile de me dire "Utilise UPX" par exemple.
Commenter la réponse de LandTech
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
__inline void myMEMCPY(BYTE *pdst, BYTE *psrc, DWORD n)
{
  do {
    *pdst++ = *psrc++;
  } while(--n);
}

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
74
Date d'inscription
dimanche 14 octobre 2007
Statut
Membre
Dernière intervention
28 février 2011
0
Merci
Bonjour,

Merci BruNews, je teste ça de suite, et aurai tu la même chose pour memset ?

Cordialement

LandTech
Commenter la réponse de LandTech
Messages postés
74
Date d'inscription
dimanche 14 octobre 2007
Statut
Membre
Dernière intervention
28 février 2011
0
Merci
Bonjour,

Ah, zut, ton code ne s'applique pas aux void* BruNews, mais merci quand même.

Cordialement

LandTech
Commenter la réponse de LandTech
Messages postés
74
Date d'inscription
dimanche 14 octobre 2007
Statut
Membre
Dernière intervention
28 février 2011
0
Merci
Bonjour,

J'aurai une question,

si on faisait un code asm du genre :
pop edx ; ça serait n
mov ecx, 0
START_COMPTEUR:
mov eax, DWORD PTR [ebp-1] + ecx ; Pour récupere par exemple l'octet ecx dans src
mov DWORD PTR [ebp-2] + ecx, eax ; Pour place l'octet recuper dans dst + ecx
add ecx
cmp ecx, edx
jne START_COMPTEUR


Cordialement

LandTech
Commenter la réponse de LandTech
Messages postés
74
Date d'inscription
dimanche 14 octobre 2007
Statut
Membre
Dernière intervention
28 février 2011
0
Merci
Bonjour,

Oui, j'aurai pu adapter, mais j'avais peur d'avoir des problèmes de format puisque je travaille avec des struct.

Pour memset et memmove j'adapterai, merci.

Cordialement

LandTech

PS : Est ce que j'aurai pu utilisé RtlMoveMemory de kernel32.dll ?
Commenter la réponse de LandTech
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
8
0
Merci
Salut,

RtlMoveMemory n'est pas documentée (Du moins celle là ne l'est pas. Celle qui est documentée est pour une utilisation en ring 0), donc pourrait disparaître de Windows. (Et puis elle ne ressemble pas à grand chose).
RtlMoveMemory de ntdll.dll marcherait probablement mieux, mais de même non documentée.
Tu pourrais t'appuyer aussi sur msvcrt.dll (Qui propose globalement toutes les fonctions de la runtime C). Mais quoiqu'elle soit très répandue, elle peut ne pas être présente.

Quoiqu'il en soit, utiliser une dll tierce pour ces quelques fonctions serait une erreur. Elle sont facile à coder et seront plus performante en étant incluse dans ton programme (Avec le __inline notamment).
Commenter la réponse de cs_rt15