Archived

This topic is now archived and is closed to further replies.

Shnoutz

What's wrong with my ZeroMemory function?

Recommended Posts

Allo, My program is somtimes crashing when I use my ZeroMemory function... do you know why? typedef OXDWORD unsigned long; typedef OXQWORD unsigned __int64; void OXZeroMemory (void *pDest, const OXDWORD iSize) { OXDWORD qwordCount = iSize >> 3; ((OXQWORD*)pDest)[qwordCount] &= (0xFFFFFFFFFFFFFFFF << ((iSize % 8) << 3)); while (qwordCount--) ((OXQWORD*)pDest)[qwordCount] = 0; } Thank you, Gab

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
What''s wrong with using memset()?

Writting to memory that doesn''t belong to you is not very nice.

Share this post


Link to post
Share on other sites
I was making an effort to optimize a little... I know that I''m writting in memory that is outside the range but I''m not changing the value of that memory... Is that wrong?

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
Yes, that is wrong. You may cross page boundaries and the CPU will trigger a page fault at that point.

Also, memset() is probably far better optimized than your version. Did you benchmark the your function? How much faster is it compared to memset()?

If memset() is slowing you down, then you should probably look into calling it less oftern instead of trying to speed it up with your own (slower and incorrect) version.

Share this post


Link to post
Share on other sites
Technically it is - you have to be able to guarantee alignment to have it function correctly (and alignment is implementation dependent).

I would expect that code to be a de-optimization from the memset provided by MSVC6/7, btw.


You know, you''d think there''d be an op code to clear a chunk of memory.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
There is: rep stosb

Having it do it fast is another problem entirely.

Share this post


Link to post
Share on other sites
I did not understand the last reply but I did understand the other ones... Thank you every one I will use memset in the future... I guess I tryed to do too much...

Share this post


Link to post
Share on other sites
rep stosb is an assembly instruction to fill a block of memory with a given value, roughtly equivalent to memset. memset actually uses rep stosd, which fills by dwords, and manually fills byte leftovers on either sides.

edit: with #pragma intrinsic or the respective compiler option, msvc will generate inline code for memset. if you have a 32-bit-aligned piece of memory whose size is also divisible by 32 bits, such as an integer array, memset(dest, 0, count) will be expanded to something like

lea di, [dest]
xor eax, eax
mov ecx, count
rep stosd

making it impossible to beat.

edit: in flat memory model, we don't reload segments?

[edited by - niyaw on November 5, 2002 12:44:12 AM]

Share this post


Link to post
Share on other sites