【发布时间】:2014-04-11 16:27:10
【问题描述】:
所以我在痛苦的调试后发现,像 wcslen 这样的 libc 函数在处理非内存对齐缓冲区时会静默失败。在我的情况下,执行 wcslen( mystr ) 会导致错误的长度值,后来才产生崩溃(在 wcstombs 中,断言 buff[-1] == 0)。
一种解决方案是让我重新编写在非对齐内存上工作所需的所有宽字符串函数。这很容易,但也很脏,而且由于没有关于 libc 的哪些部分支持非内存对齐缓冲区的文档,我担心这个问题会在其他地方再次出现。
确保我的所有指针都对齐并不是一个简单的选择,因为我要处理大量的子缓冲区缓冲区,并且必须在主缓冲区之外手动复制我的数据需要很长时间。例如,在我的情况下,失败的操作类型是当我在大缓冲区中抓取(循环)字节以查找宽字符串然后计算长度时。
由于我不打算支持太多指针内存对齐会破坏交易(崩溃)的平台,还有其他解决方案吗?也许是编译器标志?
我知道某些平台或环境需要内存对齐,但我正在处理基本的 Windows 和 Linux 用户模式,所以请不要像“你做错了,你必须始终对齐所有内容”之类的“说教”回答,除非你有一个实际的解决方案,谢谢。
【问题讨论】:
-
终于找到讨论的问题了。一定要喜欢完全没有任何文档。仍在试图找出一种禁用优化的方法,似乎这是不可能的。 forums.warchest.com/showthread.php/…
标签: c unicode glibc memory-alignment