From: Steven G. J. <st...@ab...> - 2003-02-19 21:12:36
|
Wu Yongwei wrote: > Your implementation seemed to be OK for _aligned_malloc, although I > don't think it necessary to use C99 features (stdint.h/uintptr_t; size_t > should suffice), You're right that it's not necessary for any current system AFAIK. This is not guaranteed by the C standard, though; it seemed like better style to use uintptr_t (and stdint.h is included with mingw32-runtime anyways). However, I've put autoconf-style #ifdef HAVE_STDINT_H guards around stdint.h for now. (Mainly to let me test it with non-C99 compilers.) > and ptr_align is better implemented as a macro. Last That's what inlining is for; gcc -O3 does it automatically. But I guess you're worried about the case when mingw is compiled without optimization; fine. > time you did not mention _aligned_offset_malloc, and I told you only > about _aligned_malloc, and now I see that your implementation of > _aligned_offset_malloc (and also _aligned_free) has the fault that the > return value of malloc is not stored four-byte aligned. Good point. (Current Pentia don't require this, but maybe Itanium? It's needed on Alpha and UltraSPARC.) (I don't personally care about _aligned_offset_malloc, but it doesn't make sense to implement _aligned_malloc by itself.) > I also would like that your code only bears a link to my message instead > of posting the entire one. Thanks. No problem. > Did you test your test case? It fails miserably on my Windows 2000 box > (a NULL pointer is returned). However, you implementation passed the > example in the Microsoft documentation. I ran my test case, albeit under Linux. (I also ran it under valgrind, which would catch dereferencing NULL or anything like that, so it must be that something really different is happening for you.) (I don't suppose you're running out of memory? But I'm not allocating more than a couple of megabytes, at least with the GNU/glibc malloc.) I modified the test program to explicitly check for NULL returns (instead of just relying on it to crash in that case), and still no error. I tried cross-compiling it with mingw and running it under XP, and no error. I've fixed the stored-pointer alignment, and fixed another potential problem (there was some pointer arithmetic with void*, which is nonstandard). With the fixed alignment, the test program now succeeds on AIX, Solaris, and Tru64 as well. Can you give it another try with the modified version, attached? (If it still returns NULL somehow, at least it should at least print more output.) Thanks for your feedback. Steven |