C++ 编译器';std::copy中的s对齐假设

C++ 编译器';std::copy中的s对齐假设,c++,stl,g++,compiler-optimization,built-in,C++,Stl,G++,Compiler Optimization,Built In,我正在处理一个奇怪的案例,我(突然)开始在一个库代码(我不久前写的)中出现分段错误 库中有一个负责复制缓冲区的代码,下面是代码快照: memory_manager_types::translation_status_t memory_manager::setMem(const uint64_t i_la, const void * const src_buff, const uint32_t i_size) { ... char* dst_ptr =

我正在处理一个奇怪的案例,我(突然)开始在一个库代码(我不久前写的)中出现分段错误

库中有一个负责复制缓冲区的代码,下面是代码快照:

   memory_manager_types::translation_status_t memory_manager::setMem(const uint64_t i_la, const void * const src_buff, const uint32_t i_size)
   {
        ...
        char* dst_ptr = reinterpret_cast<char*>(pa); // pa is a 'uint64_t' which holds the destination address
        const char* src_ptr = static_cast<const char*>(src_buff);
        std::copy(src_ptr, src_ptr + i_size, dst_ptr);
在添加额外的

-mpreferred-stack-boundary=4 -mstackrealign
一切顺利

EDIT1

我没有提到的一点可能是我问题的答案,那就是使用我的库的代码是用较低版本的GCC(4.2.2)编译的

现在根据
-mstackreallign
标志的描述:

-mstackrealign

在入口处重新对齐堆栈。在英特尔x86上,-mstackreallign选项将生成另一个序言和尾声,在必要时重新调整运行时堆栈。这支持混合 保留4字节对齐堆栈的传统代码与 保留16字节堆栈以实现SSE兼容性。另请参见属性 强制对齐参数指针,适用于单个函数


G++5.2.0是否默认采用16字节堆栈对齐方式?

src\u buf
也是此函数的一个参数(不是:
src\u buf
,不是
*src\u buf
),因此编译器可能无法“推断”它是16字节对齐的。可能是
dst_-buf
导致了问题。@jbapple在本例中
dst_-buf
是4k对齐的,因此它是正常的。
-mpreferred-stack-boundary=4 -mstackrealign