【问题标题】:Why would Microsoft still support nothrownew.obj?为什么微软仍然支持 nothrownew.obj?
【发布时间】:2012-01-08 13:28:12
【问题描述】:

According to MSDN,Microsoft 仍将 nothrownew.obj 与 Visual C++ 10 (Visual Studio 2010) 运行时库一起提供,以便用户可以链接它并具有“普通”的不合标准行为(不是 nothrow 风味) new 在分配失败时返回 null。这种不合标准的行为可以追溯到现在被认为非常古老的 Visual C++ 6。

为什么要这样做?我的意思是他们使每个新版本的编译器越来越符合标准。例如,Visual C++ 7 将支持“默认 int”,但 Visual C++ 9 不支持。 new 的旧的不合标准行为可以通过稍微更改代码以使用 newnothrow 风格轻松实现 - 这很简单也很容易。

为什么这个选项如此重要以至于微软仍然支持它?

【问题讨论】:

  • 因为微软在其历史上从未退役过任何东西? :o)
  • @deceze:嗯,他们确实退休了“default-int”。

标签: c++ visual-c++ memory-management new-operator


【解决方案1】:

嗯,这是一个悬而未决的问题,因为除了微软负责人之外,没有人可以肯定地说——如果有的话。所以,我会咬一口:

我猜是为了方便:

  1. Microsoft 本身可能在他们的某些产品中需要它,并且将它与编译器工具一起使用会更容易。
  2. Microsoft 可能知道有人(比如大型供应商/应用程序)仍然需要它,并且仍然提供它更容易(甚至是特定于编译器的必要)。
  3. Microsoft 可能知道/预期它通常仍“广泛”用于旧版应用程序中。大或小。
  4. “不痛”,可以说。例如,Microsoft 在保持 Windows 向后兼容性方面有着悠久的历史(请参阅 Raymond Chens blog),同样,可以说并不总是更好。
  5. 文档、测试等需要更改(或删除,但仍然如此)。

也就是说,删除它可能比保留它更麻烦。

至少他们需要/应该在删除版本之前提供弃用通知。我不知道他们是否为 VS2010 或任何以前的版本这样做。

【讨论】:

  • nothrownew.obj 对于 Xbox360 开发来说是一件大事,您需要高性能代码,而 EH 可能会在 360 上破坏(就代码生成而言)。据我所知,他们即将推出的下一代游戏机(Xbox One)不再是这种情况,因为它严格来说是一个 x64 平台和基于 WinRT(也依赖于 EH)
【解决方案2】:

因为我现在(2012 年)将产品从 Visual C++ 6.0 移植到 Visual Studio 2010,这极大地有助于加快开发速度。我们也不会在未来几年内进行 Unicode 转换。如果微软不提供兼容性功能,我会自己构建它。

顺便说一句,我们是专业领域的主要独立软件开发商。如果我们决定改变操作系统,整个行业可能会改变。 (在 Windows 之前,我们也曾经构建过专门的操作系统。)

【讨论】:

  • 所以?这并不多,尤其是因为您可能需要为每个new 花费一分钟来检查NULL 是否真的被处理了。
  • 其实没有。它是旧代码,旧代码凭借在该领域大约 20 年的“工作”。我们不想从根本上改变现有的行为。当然,从长远来看,它应该会出来,但一步一步来。
猜你喜欢
  • 2011-01-15
  • 1970-01-01
  • 2015-01-18
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
相关资源
最近更新 更多