假设符合IEEE-754标准,是否保证在通过双重传输时保留浮动?
换句话说,以下断言是否会始终满足?
int main()
{
float f = some_random_float();
assert(f == (float)(double)f);
}
Run Code Online (Sandbox Code Playgroud)
假设f
可以获取IEEE定义的任何特殊值,例如NaN和Infinity.
根据IEEE的说法,是否存在断言将被满足的情况,但是在通过double传输之后不能保留确切的位级表示?
代码段在C和C++中都有效.
任何人都可以解释创建配置OPEN_ALWAYS
和Windows API CREATE_ALWAYS
的CreateFile()函数之间的区别吗?
对我来说,似乎他们都只是'创建文件,如果它还不存在'.
假设我有四个32位数字,定义为它们的位不重叠,即
unsigned long int num0 = 0xFF000000;
unsigned long int num1 = 0x00FF0000;
unsigned long int num2 = 0x0000FF00;
unsigned long int num3 = 0x000000FF;
Run Code Online (Sandbox Code Playgroud)
每个号码中的哪个位置可以代替FF
s.
我是否正确地说添加和按位或者总是会为这种数字产生相同的输出?
谢谢!
我正在尝试编写异常安全代码.我发现使用C++ 11的noexcept说明符可以使这个目标更容易实现.
当然,一般的想法是,如果并且只有当它调用的所有函数也标记为"noexcept"时,函数才应标记为"noexcept".
问题在于,在大型代码库中,来自不同人员的补丁经常合并在一起,很难确保维持这种一致性.
因此,我希望能够运行静态分析,该分析可以列出标记为"nothrow"的函数调用未标记为"nothrow"的函数的所有位置.
据我在man-page中看到,GCC无法帮助我.有没有可以帮助我的独立工具?或者其他一些编译器?
C++标准是否保证未初始化的POD成员在新的位置后保留其先前的值?
或者更准确地说,根据C++ 11,下面的断言是否总能得到满足?
#include <cstdlib>
#include <cassert>
struct Foo {
int alpha; // NOTE: Uninitialized
int beta = 0;
};
int main()
{
void* p = std::malloc(sizeof (Foo));
int i = some_random_integer();
static_cast<Foo*>(p)->alpha = i;
new (p) Foo;
assert(static_cast<Foo*>(p)->alpha == i);
}
Run Code Online (Sandbox Code Playgroud)
C++ 03的答案是否相同?
对于某些整数类型,即使浮点值远远超出整数的可表示范围,如何找到最接近某个浮点类型值的值.
或者更确切地说:
我们F
是一个浮点型(可能是float
,double
或long double
).让I
是一个整数类型.
假设两个F
并I
有有效的专业化std::numeric_limits<>
.
给定可表示的值F
,并且仅使用C++ 03,如何找到最接近的可表示值I
?
我追求的是一个纯粹,高效且线程安全的解决方案,除了C++ 03所保证的以外,它不会对平台做任何假设.
如果不存在这样的解决方案,是否可以使用C99/C++ 11的新功能找到一个?
lround()
由于报告域错误的非平凡方式,使用C99似乎是有问题的.这些域错误是否可以以便携式和线程安全的方式捕获?
注意:我知道Boost可能通过其boost::numerics::converter<>
模板提供解决方案,但由于其高复杂性和冗长性,我无法从中提取必需品,因此我无法检查他们的解决方案是否成功超出C++ 03的假设.
下面的天真方法失败了,因为I(f)
当C++ 03的整数部分f
不是可表示的值时,结果是未定义的I
.
template<class I, class F> I closest_int(F f)
{
return I(f);
}
Run Code Online (Sandbox Code Playgroud)
然后考虑以下方法:
template<class I, class F> I closest_int(F f)
{
if (f < std::numeric_limits<I>::min()) return std::numeric_limits<I>::min();
if (std::numeric_limits<I>::max() < f) return std::numeric_limits<I>::max();
return I(f);
} …
Run Code Online (Sandbox Code Playgroud) 在我看来,C++标准中存在不一致性,特别是在C++ 17草案(N4659)的§30.7.5.2.4中,关于何时在输出流(operator<<()
)的格式化输出操作中扩展字符.完全相同的不一致似乎反映在en.cppreference.com中.
首先,假设以下声明:
std::ostream out;
std::wostream wout;
char ch;
wchar_t wch;
const char* str;
const wchar_t* wstr;
Run Code Online (Sandbox Code Playgroud)
然后说明
out << ch
不执行字符扩展,out << str
进行角色拓宽,wout << ch
进行角色拓宽,wout << str
进行角色拓宽,wout << wch
不执行字符扩展,wout << wstr
执行字符扩展.第一个也是最明显的不一致是(6)不可能是真的,因为没有widen()
函数采用wchar_t
参数,只有一个char
参数.
第二个(看似)不一致是在(1)和(2)之间.对我而言,out << "x"
应该扩大'x'
,但out << 'x'
不应该扩大.
我是否误解了标准文本,或者那里有什么问题?如果后者是真的,你知道预期的行为是什么吗?
编辑:显然,这种不一致(如果我是对的),至少从C++ 03(§27.6.2.5.4)开始就存在于标准中.文本在中间标准上有所改变,但正如我在上面解释的那样,不一致仍然存在.
该GCC手册仅示出了其中__builtin_expect()被置于围绕"如果"语句的所有条件的示例.
我还注意到GCC不会抱怨,如果我使用它,例如,使用三元运算符,或任何任意积分表达式,即使是未在分支上下文中使用的表达式.
所以,我想知道它的实际使用的基本限制是什么.
在这样的三元运算中使用时是否会保持其效果:
int foo(int i)
{
return __builtin_expect(i == 7, 1) ? 100 : 200;
}
Run Code Online (Sandbox Code Playgroud)
那么这个案子呢:
int foo(int i)
{
return __builtin_expect(i, 7) == 7 ? 100 : 200;
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
int foo(int i)
{
int j = __builtin_expect(i, 7);
return j == 7 ? 100 : 200;
}
Run Code Online (Sandbox Code Playgroud) 以下是根据C++标准定义明确的吗?
char* p = 0;
std::equal(p, p, p);
Run Code Online (Sandbox Code Playgroud)
问题是这样的:
是否标准要求,std::equal(begin1, end1, begin2)
以这样的方式来实现,如果begin1 == end1
,那么begin1
和begin2
可以是任何指针,甚至一个不指向有效的内存对象?
我认为这是标准的意图,但我无法找到一个明确的陈述.
我担心这一点的原因是,VisualStudio显然试图检查begin2
甚至何时的"有效性" begin1 == end1
.这与我对标准要求的理解相矛盾.
编辑:这是VS 2012的代码,我认为这违反了标准:
template<class _InIt1, class _InIt2> inline
bool equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2)
{ // compare [_First1, _Last1) to [First2, ...)
_DEBUG_RANGE(_First1, _Last1);
_DEBUG_POINTER(_First2);
return (_Equal1(_Unchecked(_First1), _Unchecked(_Last1), _First2, _Is_checked(_First2)));
}
template<class _Ty> inline
void _Debug_pointer(const _Ty *_First, _Dbfile_t _File, _Dbline_t _Line)
{ // test iterator for non-singularity, const pointers …
Run Code Online (Sandbox Code Playgroud) 根据C++标准(C++ 17 draft(N4659)的第30.7.5.2.4节),如果是a 并且是a ,out << ch
则不会执行扩展操作.ch
ch
char
out
std::ostream
这是否意味着标准保证std::ctype<char>::widen()
(即char
- > char
)是widen(ch) == ch
基本源字符集中所有字符的标识函数()?
如果是这样,反过来又是否意味着标准要求所有语言环境使用基本源字符集中相同的非宽(或多字节)字符编码?
如果没有,似乎out << 'x'
对文字的特定字符编码选择可能不适用于所有语言环境,即使它在某些语言环境中有效.也就是说,可能没有选择字符文字编码,因此可以out << 'x'
同时在所有语言环境中使用.