c++ - MSVC 是否曾经正确支持基于枚举的位域?
问题描述
当我第一次发布这个相关问题时,我以为我遇到了一些奇怪的边缘情况,可能包括未定义的行为。但是,如果您阅读那里的最新更新,您会发现一个更简单的示例也不起作用。在此处测试示例。
struct S
{
int a{};
enum{} b : 1;
enum{} c : 1;
};
auto test()
{
return S{}; //Buffer overrun on this line
}
编译器有用地告诉我们它在这里做错了:
警告 C4789:大小为 8 字节的缓冲区“将被溢出;从偏移量 4 开始写入 8 个字节
struct S
是 8 个字节,因为编译器已经正确计算出来了。但是,在尝试构造此结构的实例时,它最终总共写入了 12 个字节。与相关问题中的原始示例不同,此特定示例还演示了未启用任何优化的问题。
Compiler Explorer 上的所有 VC++ 编译器都显示了这种错误的代码生成,尽管只有较新的编译器对此发出警告。我问这个单独的问题,以了解这个问题是否一直存在,或者它是否是最近的回归。如果它一直存在,那么位域工作了这么长时间一定是纯粹的运气。所以要明确一点,已知 VS 2017 和 VS 2019 会受到影响,但我没有安装早期版本。如果其他人可以测试这些并在此处编写结果,和/或解释为什么 VC++ 编译器而不是 GCC/Clang 会出现此问题,那将非常有帮助。
我希望这不是要求这个的错误地方。
解决方案
推荐阅读
- javascript - 我的 Promise.all() 实现有什么问题?
- javascript - 如何缩写 2 个看起来几乎相同的变量?
- javascript - 如何增加整个标签的字体大小
- java - 基于键盘使javafx选择框选择项目
- c++ - 在 OpenMP 中,我们如何并行运行多个代码块,其中每个代码块包含 omp single 和 omp for 循环?
- python - 如何在硒上循环执行脚本?
- php - 调用未定义的函数 get_translations_for_domain() Wordpress
- r - 如何用 R 处理 csv 行的中断?
- javascript - 如何根据列表中的复选框禁用 Vue 动态按钮
- c++ - 为什么 rand() % N 对于小型分布来说足够了?