小编nil*_*ilo的帖子

AAPCS (ARM ABI) 下的 C/C++ 结构填充有多稳定?

C99标准告诉我们:

结构对象内可能有未命名的填充,但不是在其开头。

在结构或联合的末尾可能有未命名的填充。

我假设这也适用于任何 C++ 标准,但我没有检查它们。

让我们假设在 ARM Cortex-M 上运行的 C/C++ 应用程序(即在应用程序中使用两种语言)将一些持久数据存储在本地介质(例如串行 NOR 闪存芯片)上,并在上电后读取它循环,可能在将来升级应用程序本身之后。升级后的应用程序可能是用升级后的编译器(我们假设是 gcc)编译的。

让我们进一步假设开发人员很懒惰(当然不是我),并且直接将一些普通的 C 或 C++ 流式传输struct到闪存,而不是像任何偏执的有经验的开发人员那样首先将它们序列化。

事实上,有问题的开发人员很懒惰,但并非完全无知,因为他阅读了AAPCS(Arm 架构的过程调用标准)

除了懒惰之外,他的理由如下:

  • 他不想打包structs 以避免在应用程序的其余部分出现未对齐问题。
  • AAPCS 为每种基本数据类型指定了固定对齐方式。
  • 填充的唯一合理动机是实现正确对齐。
  • 因此,他认为,填充(以及因此 memberoffsetof和 total sizeof)完全struct由 AAPCS为任何 C 或 C++ 确定。
  • 因此,他进一步解释说,我的应用程序无法解释同一应用程序的早期版本会写入的某些回读数据(当然,假设闪存中数据的偏移量没有在写作和阅读之间变化)。

不过,开发者是有良心的,他有点担心:

  • C 标准没有提到任何填充的原因。实现正确对齐可能是填充的唯一合理原因,但根据标准,编译器可以随意填充尽可能多的内容。
  • 他怎么能确定他的编译器真的遵循AAPCS呢?
  • 他的假设是否会突然被他将开始使用的一些明显无关的编译器标志或编译器升级打破?

我的问题是:那个懒惰的开发人员的生活有多危险?换句话说,struct在上述假设下,填充在 C/C++ 中的稳定性如何?

结论

在提出这个问题两周后,收到的唯一答案并没有真正回答所提出的问题。我也在ARM 社区论坛上问过完全相同的问题,但根本没有答案。

然而,我选择接受3246135作为答案,因为:

  1. 我将没有正确答案视为与此案非常相关的信息。软件问题解决方案的正确性应该是显而易见的。在我的问题中所做的假设可能是正确的,但我无法轻易证明。此外,如果假设不正确,在一般情况下,后果可能是灾难性的。

  2. 相比风险,开发者在使用答案中暴露的策略时的负担似乎非常合理。假设一个恒定的字节序(这很容易强制执行),它是 100% …

c c++ arm padding abi

4
推荐指数
1
解决办法
237
查看次数

在 Pandas DataFrame 中选择包含至少一个 True 值的列的最佳解决方案

In [4]: df = pd.DataFrame({'a': [True, False, True], 'b': [False, False, False], 
   ...: 'c': [False, False, False], 'd': [False, True, False], 
   ...: 'e': [False, False, False]})                                                                                                                                                                                                                                              


In [5]: df                                                                                                                                                                                                                                                                        
Out[5]: 
       a      b      c      d      e
0   True  False  False  False  False
1  False  False  False   True  False
2   True  False  False  False  False

In [6]: df[df.any()[df.any()].index]                                                                                                                                                                                                                                              
Out[6]: 
       a      d
0   True  False
1  False   True
2   True  False
Run Code Online (Sandbox Code Playgroud)

[6] 下的代码做了我想要的。然而,我的问题是:有更好的解决方案吗?也就是说,更简洁和/或更优雅。

python dataframe pandas

4
推荐指数
1
解决办法
87
查看次数

标签 统计

abi ×1

arm ×1

c ×1

c++ ×1

dataframe ×1

padding ×1

pandas ×1

python ×1