相关疑难解决方法(0)

标准对未对齐的内存访问有何看法?

我搜索了关于未对齐访问的标准,但没有找到任何东西(也许我是无意的).

是不确定的行为?它是实现定义的吗?

由于许多当前的CPU支持未对齐访问,因此未对齐的内存访问是实现定义的,这是明智的.是这样的吗?

通过未对齐访问,我的意思是例如:

alignas(int) char buffer[sizeof(int)+1];
int &x = *new(buffer+1) int;
x = 42;
Run Code Online (Sandbox Code Playgroud)

c++ memory-alignment language-lawyer c++17

23
推荐指数
1
解决办法
1334
查看次数

如何使用alignas替换pragma pack?

我试图理解如何使用alignas,我想知道它是否可以替代pragma pack,我已经努力验证它但没有运气.使用gcc 4.8.1(http://ideone.com/04mxpI)我总是在STestAlignas下面获得8个字节,而使用pragma pack时它是5个字节.我想要的是使sizeof(STestAlignas)返回5.我尝试在clang 3.3上运行此代码(http://gcc.godbolt.org/)但我收到错误:

!!错误:对于'long'类型,请求的对齐小于8的最小对齐 - 正好在alignas使用之下.

那么也许对齐有最小的对齐值?

下面是我的测试代码:

#include <iostream>
#include <cstddef>
using namespace std;

#pragma pack(1)
struct STestPragmaPack {
  char c;
  long d;
} datasPP;
#pragma pack()

struct STestAttributPacked {
  char c;
  long d;
} __attribute__((packed)) datasAP;

struct STestAlignas {
  char c;
  alignas(char) long d;
} datasA;

int main() {
    cout << "pragma pack = " << sizeof(datasPP) << endl;
    cout << "attribute packed = " << sizeof(datasAP) << endl;
    cout << "alignas …
Run Code Online (Sandbox Code Playgroud)

c++ gcc c++11 alignas

12
推荐指数
1
解决办法
3007
查看次数

在 C++ 中声明、操作和访问未对齐的内存

我最近发布了一个关于未对齐内存访问的问题,但给出答案后,我有点迷失。我经常听到“对齐的内存访问比未对齐的访问效率要高得多”,但我实际上不确定什么是未对齐的内存。最后:

  • 什么是未对齐内存?
  • 如何在 C++ 中声明未对齐的内容?(小示例程序)
  • 如何在 C++ 中访问和操作未对齐的内容?(小示例程序)
  • 是否有一种方法可以使用定义的行为方法来操作未对齐的内存,或者所有这些都与 C++ 中的平台相关/未定义的行为有关?

c++ memory memory-alignment undefined-behavior

2
推荐指数
1
解决办法
1699
查看次数