标准中"似乎"这个短语的确切含义是什么?当用户可以修改行为的各个部分时,它是如何工作的.
在讨论nothrow版本时,问题是关于C++标准operator new
.18.4.1.1/7读(我的重点):
这个nothrow版本的operator new返回一个获得的指针,好像从普通版本获得的一样.
我的理解是,只要行为合适,"似乎"就不需要特定的实现.所以,如果operator new
像这样实现(我知道这不是一个兼容的实现,因为没有循环或使用new_handler;但我正在缩短它以专注于我的问题):
// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s)
{
void *p = malloc(s);
if (p == 0)
throw std::bad_alloc();
return p;
}
Run Code Online (Sandbox Code Playgroud)
那么写下这样的nothrow版本是合法的:
// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s, const std::nothrow_t &nt)
{
return malloc(s);
}
Run Code Online (Sandbox Code Playgroud)
但是,假设程序替换operator new
为使用其他分配器."似乎"意味着编译器必须自动更改nothrow版本的行为才能使用其他分配器吗?开发人员是否需要更换普通版本和非版本版本?
我在VC++中有以下代码:
for (int i = (a - 1) * b; i < a * b && i < someObject->someFunction(); i++)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
据我所知,编译器优化了所有这些算术运算,并且它们不会在每个循环上执行,但我不确定它们是否可以告诉上面的函数每次都返回相同的值并且它不需要每次都要打电话.
将所有计算保存到变量中,或者仅依靠编译器优化来获得更易读的代码是一种更好的做法吗?
int start = (a - 1) * b;
int expra = a * b;
int exprb = someObject->someFunction();
for (int i = startl i < expra && i < exprb; i++)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)