如果通过引用参数使用gcc C ++显式对齐会丢失

时间:2017-03-29 07:28:57

标签: c++ gcc reference alignment packed

以下代码定义了一个打包(对齐1)结构,其中dwBug成员未正确对齐。如果通过引用参数的方式将此成员分配给该成员,则该不适用于不支持未对齐访问的体系结构(例如ARM)。

我并非100%确定我所做的事情是合法的;但我的理解是,除非我明确地强制转换编译器,否则应该跟踪它是否可以按原样复制数据,或者它是否必须解析未对齐的访问。即使-Wall

也没有警告
#include <stdint.h>
#include <stdio.h>

#pragma pack(1)
typedef struct {
    uint16_t w1;
    uint32_t dwBug;
} STest;
#pragma pack()

class CTest
{
public:
    void testIt()
    {
        copyUnaligned(member.dwBug);
        printf("%08x\n", member.dwBug);
    }

private:
    void copyUnaligned(uint32_t &copyIt)
    {
        copyIt = 0x12345678;
    }

    STest member;
};

int main(int, char **)
{
    CTest test;

    test.testIt();
}

此代码的输出为00001234

# cat /proc/cpuinfo
model name      : ARM926EJ-S rev 5 (v5l)
Features        : swp half fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant     : 0x0
CPU part        : 0x926
CPU revision    : 5

gcc是为arm-linux-gnueabi目标构建的5.3.1交叉编译器。

由于

0 个答案:

没有答案