相关疑难解决方法(0)

如何在C++类内存结构中创建"spacer"?

问题

低级裸机嵌入式上下文中,我想在内存中创建一个空格,在C++结构中并且没有任何名称,以禁止用户访问这样的内存位置.

现在,我已经通过设置一个丑陋的uint32_t :96;位域来实现它,它将方便地取代三个单词,但它会从GCC发出警告(Bitfield太大而不适合uint32_t),这是非常合理的.

虽然它工作正常,但是当你想要分发一个包含数百个警告的库时它不是很干净......

我该怎么做呢?

为什么首先出现问题?

我正在研究的项目包括定义整个微控制器线路(STMicroelectronics STM32)的不同外设的存储器结构.为此,结果是一个类,它包含几个结构的并集,这些结构定义了所有寄存器,具体取决于目标微控制器.

一个非常简单的外设的一个简单示例如下:通用输入/输出(GPIO)

union
{

    struct
    {
        GPIO_MAP0_MODER;
        GPIO_MAP0_OTYPER;
        GPIO_MAP0_OSPEEDR;
        GPIO_MAP0_PUPDR;
        GPIO_MAP0_IDR;
        GPIO_MAP0_ODR;
        GPIO_MAP0_BSRR;
        GPIO_MAP0_LCKR;
        GPIO_MAP0_AFR;
        GPIO_MAP0_BRR;
        GPIO_MAP0_ASCR;
    };
    struct
    {
        GPIO_MAP1_CRL;
        GPIO_MAP1_CRH;
        GPIO_MAP1_IDR;
        GPIO_MAP1_ODR;
        GPIO_MAP1_BSRR;
        GPIO_MAP1_BRR;
        GPIO_MAP1_LCKR;
        uint32_t :32;
        GPIO_MAP1_AFRL;
        GPIO_MAP1_AFRH;
        uint32_t :64;
    };
    struct
    {
        uint32_t :192;
        GPIO_MAP2_BSRRL;
        GPIO_MAP2_BSRRH;
        uint32_t :160;
    };
};
Run Code Online (Sandbox Code Playgroud)

所有GPIO_MAPx_YYY都是宏,定义为uint32_t :32或寄存器类型(专用结构).

在这里,您可以看到uint32_t :192;哪个效果很好,但它会触发警告.

到目前为止我考虑过的事情:

我可能已经用几个替换它uint32_t :32;(这里有6个),但我有一些极端情况,我有uint32_t :1344;(42)(其中).所以我宁愿不在8k其他行上添加大约100行,即使结构生成是脚本化的.

确切的警告信息是这样的:( width of 'sool::ll::GPIO::<anonymous union>::<anonymous struct>::<anonymous>' …

c c++ memory-management bare-metal low-level

93
推荐指数
6
解决办法
5632
查看次数

这些成员是否有未指定的订单?

一位同事告诉我,在以下类型中,所有成员在内存中都有未指定的顺序(相对于彼此).

我对此表示怀疑,因为它们都具有相同的访问级别.

谁是对的?

struct foo { public: int x; public: int y; public: int z; };
Run Code Online (Sandbox Code Playgroud)

c++ c++11 c++03

28
推荐指数
1
解决办法
659
查看次数

班级成员的最佳顺序是什么?

如果我有以下课程:

class Example
{
  bool m_b1;
  SomeClass m_sc;  
  bool m_b2;
  char * m_name;
  bool m_b3;
  int m_i1;
  SomeClass * m_sc;
  int m_i2;
};
Run Code Online (Sandbox Code Playgroud)

会员的最佳顺序是什么?据我所知,在创建此类的实例时,成员声明的顺序等于内存中成员的顺序.

  • 我应该对成员进行排序,以便相同的类型在一起吗?
  • 所有指针都算作同一类型吗?
  • 重新排列是否会影响对象的大小?4或8字节对齐是否适用于此处?
  • 我怎么能看到上面的效果?sizeof是否显示对象使用的内存,包括用于对齐的空白空间?
  • 是否最好在一天结束时对成员进行排序,以便更容易理解其含义和背景?

c++ optimization

9
推荐指数
2
解决办法
810
查看次数

什么阻止__attribute __((packed))进入ISO C/C++?

这是我在编写某些类系统软件时使用C/C++的最重要原因之一,但它只不过是一个非常常见的编译器扩展.为什么委员会不考虑正式支持它?它是否与现有规范中的任何子句不兼容,例如public和private是否对对象的内存布局有影响?

c c++ attributes memory-alignment

8
推荐指数
1
解决办法
143
查看次数