Memcpy

Résolu
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011 - 14 déc. 2010 à 20:46
cs_rt15 Messages postés 3874 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

12 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 déc. 2010 à 22:33
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++
3
mogwai93 Messages postés 362 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 4 novembre 2023
14 déc. 2010 à 22:41
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
0
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
14 déc. 2010 à 23:09
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))
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 déc. 2010 à 09:02
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++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
15 déc. 2010 à 09:32
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
0
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
15 déc. 2010 à 19:02
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 déc. 2010 à 19:20
__inline void myMEMCPY(BYTE *pdst, BYTE *psrc, DWORD n)
{
  do {
    *pdst++ = *psrc++;
  } while(--n);
}

ciao...
BruNews, MVP VC++
0
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
15 déc. 2010 à 19:30
Bonjour,

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

Cordialement

LandTech
0
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
15 déc. 2010 à 19:35
Bonjour,

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

Cordialement

LandTech
0
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
15 déc. 2010 à 19:46
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
0
LandTech Messages postés 73 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 28 février 2011
15 déc. 2010 à 23:36
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 ?
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
18 déc. 2010 à 13:17
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).
0
Rejoignez-nous