如果 std::vector<bool> 被重写为使用标准矢量实现,那将如何破坏旧软件?
If std::vector<bool> was rewritten to use the standard vector implementation, how would that break old software?
根据 this question 中的答案,std::vector<bool>
实现了“特殊”逻辑(允许每个布尔值存储在单个位中,而不是占用整个字节),并且因此,它不能完全满足 STL 容器的要求,因此不鼓励使用它。但是,出于向后兼容的原因,保留了“特殊”逻辑。
我的问题是,如果 C++ 实现者放弃“特殊”逻辑并将 std::vector<bool>
变成 std::vector
模板的另一个专门化,这会导致什么向后兼容性问题?即是否有一些旧软件可能依赖的特殊行为需要保留位打包实现? (我唯一能想到的是,在 RAM 受限的环境中,一些旧软件可能依赖于内存使用量减少八倍才能运行,但这在大多数情况下似乎是一个相对次要的问题)
我认为问题的症结在于 DLL 兼容性。
如果他们更改了任何标准 classes 的内存,那么 class 就不能通过 DLL 边界,因为我们不知道 DLL 需要哪种内存格式, 除非我们确定它们是用相同的 C++ 版本编译的。
这也是为什么 Windows API 采用指向结构的指针,结构的第一个成员是大小。这允许他们在 Windows 的新版本中将成员附加到结构中,但旧的应用程序将继续能够调用这些方法。
首先,这将是 ABI 中断。很难从标准库中更改任何内容的一个主要原因。
其次,使用 flip
的任何内容都会中断:
#include <vector>
int main() {
std::vector<bool> vec { true };
vec[0].flip(); // can't be done with regular bool
}
第三,由于某些人可能依赖的重载解析,可能还会出现其他问题。
旁注:您始终可以改用 boost::container::vector
,它不是专门用于 bool
。
根据 this question 中的答案,std::vector<bool>
实现了“特殊”逻辑(允许每个布尔值存储在单个位中,而不是占用整个字节),并且因此,它不能完全满足 STL 容器的要求,因此不鼓励使用它。但是,出于向后兼容的原因,保留了“特殊”逻辑。
我的问题是,如果 C++ 实现者放弃“特殊”逻辑并将 std::vector<bool>
变成 std::vector
模板的另一个专门化,这会导致什么向后兼容性问题?即是否有一些旧软件可能依赖的特殊行为需要保留位打包实现? (我唯一能想到的是,在 RAM 受限的环境中,一些旧软件可能依赖于内存使用量减少八倍才能运行,但这在大多数情况下似乎是一个相对次要的问题)
我认为问题的症结在于 DLL 兼容性。
如果他们更改了任何标准 classes 的内存,那么 class 就不能通过 DLL 边界,因为我们不知道 DLL 需要哪种内存格式, 除非我们确定它们是用相同的 C++ 版本编译的。
这也是为什么 Windows API 采用指向结构的指针,结构的第一个成员是大小。这允许他们在 Windows 的新版本中将成员附加到结构中,但旧的应用程序将继续能够调用这些方法。
首先,这将是 ABI 中断。很难从标准库中更改任何内容的一个主要原因。
其次,使用 flip
的任何内容都会中断:
#include <vector>
int main() {
std::vector<bool> vec { true };
vec[0].flip(); // can't be done with regular bool
}
第三,由于某些人可能依赖的重载解析,可能还会出现其他问题。
旁注:您始终可以改用 boost::container::vector
,它不是专门用于 bool
。