gpt4 book ai didi

c++ - 为什么在 STL 中允许未定义的行为?

转载 作者:可可西里 更新时间:2023-11-01 15:48:53 30 4
gpt4 key购买 nike

默认情况下,std::stack 的“底层容器”是 std::deque。因此,对于 std::deque 而言,任何未定义的行为对于 std::stack 而言都是未定义的行为。 cppreference和其他站点在描述成员函数的行为时使用术语“有效地”。我认为这意味着它适用于所有意图和目的。因此,调用 top()pop() 等同于调用 back()pop_back() ,并在空容器上调用这些是未定义的行为。

根据我的理解,它是未定义行为的原因是为了保留不抛出保证。我的理由是 std::vectoroperator[] 具有不抛出保证,如果容器大小大于 N,则为未定义行为,但 at( ) 有很强的保证,如果 n 超出范围,则抛出 std::out_of_range

所以我的问题是,某些事物可能具有未定义的行为并且具有不抛出保证与具有强保证但抛出异常的背后的基本原理是什么?

最佳答案

当允许未定义的行为时,通常出于效率的考虑。

如果标准指定了当您越界访问数组时必须发生的事情,它将强制实现检查索引是否在边界内。 vector 也是如此,它只是动态数组的包装器。

在其他情况下,允许未定义行为以允许实现中的自由。但这也确实与效率有关(因为某些可能的实现策略在某些机器上可能比在其他机器上更有效,而 C++ 让实现者根据需要选择最有效的策略。)

关于c++ - 为什么在 STL 中允许未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22059258/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com