草庐IT

c++ - 实现定义的缩小转换?

C++11形式化了缩小转换的概念,并且不允许在列表初始化的顶层使用一个。我想知道是否给定两种类型T和U,它可以由实现定义是否从T转换至U正在缩小。根据我对标准的阅读,是这样的。这是我的推理:根据dcl.init.list(8.5.4)第7段,转换可以缩小的一种方式是,如果它是“从整数类型或无范围枚举类型到整数的隐式转换”不能表示原始类型的所有值的类型”。考虑从unsignedint进行隐式转换至long.关于int的相对大小和long,C++只需要sizeof(int).考虑一个实现A,其中sizeof(int)==sizeof(long).在这个实现中,long不能表示unsigne

c++ - float、double 和 long double 是否有保证的最小精度?

从我之前的问题“Isfloatingpointprecisionmutableorinvariant?”我收到了一个response其中说,CprovidesDBL_DIG,DBL_DECIMAL_DIG,andtheirfloatandlongdoublecounterparts.DBL_DIGindicatestheminimumrelativedecimalprecision.DBL_DECIMAL_DIGcanbethoughtofasthemaximumrelativedecimalprecision.我查看了这些宏。它们位于标题中。.来自cplusplusreference

c++ - 模板参数可以同时是 int 和 unsigned long 吗?

我有以下代码:#includetemplateclassA{};templateclassB;templateclassB>{};intmain(){B>b;return0;}在这里,B被模板化为int而A被模板化为size_t,它是一个unsignedlong我正在使用的两个编译器。当我使用编译器1(当前编译器)时,一切都按照我期望的方式编译和工作。当使用编译器2(我们正在转向的编译器)时,我收到一个编译器错误,指出B没有采用unsignedlong的模板特化-它已解释3作为unsignedlong因为它需要是A的一个,但是对于B。修复很明显,-只需更改B也采用size_t(或更改A

位域结构的 C++ 严格别名规则

下面的getValue()成员函数是否违反了c++严格的别名规则?根据标准,我认为setValue()违反了严格的别名规则,因为double既不是聚合类型也不是IEEE754_64的基类。getValue()怎么样?当数据成员是位字段形式时,是否是未定义的行为,如下例?我在一个大型项目中使用类似的代码。GCC-O2和-O3输出错误值。如果我添加-fno-strict-aliasing,问题就消失了。此外,如果我使用memcpy而不是在getValue()中强制转换,问题就消失了。不确定这是否是GCC错误。#include#includeusingnamespacestd;structI

c++ - gcc 中的 Borland 风格 __closure

我是使用gnuC++编程的新手。我有一个我认为可以转换为跨平台的应用程序,大约两个月前我开始使用C::B。我有很多问题,但我解决了它们,将原始代码保留在对象类或结构的#ifdefBCB...#else...#endifblock中。我无法解决以下问题,因为它非常复杂。函数声明自1997/1998年以来一直有效,应用程序的每个点都是依赖于这些定义和实现开发的。它们用于对象间、进程间和网络通信以及所有交互事件系统。只要我们的JetRtl.dll准备好服务并且调用者知道参数的数量,任何地方的任何函数都可以使用任意数量(最多50个)的参数直接调用,或通过流连接调用。我解释了这么久,因为据我所知

c++ - 查找间隔之间的素数总和(C++ 程序不适用于大数)

我的代码如下。它工作得很好,而间隔不是很大。但是,每当我超过一百万时,程序就会停止。例如,对于区间2到2000000,素数之和应该是142913828922(从书的背面看),而我的应用程序显示1179908154。有人可以指出我哪里出错了。#include#include#defineBELOW2000000;usingnamespacestd;boolisPrime(intnum){inti;for(i=2;i 最佳答案 您正在处理的问题是integeroverflow.(signed)long在大多数机器上可以有-2147483

c++ - 尾调用优化似乎会稍微降低性能

在快速排序实现中,左侧的数据是针对纯-O2优化的代码,右侧的数据是针对-O2优化的代码(已启用-fno-optimize-sibling-calls标志),即关闭了尾部调用优化功能。这是3次不同运行的平均值,变化似乎可以忽略不计。值的范围是1-1000,以毫秒为单位。编译器是MinGWg++,版本6.3.0。sizeofarraywithTLO(ms)withoutTLO(ms)8M35,08334,0514M8,9528,6271M613609下面是我的代码:#includeusingnamespacestd;intN=4000000;voidqsort(int*arr,intsta

c++ - 为什么我的程序很慢?我怎样才能提高它的效率?

我有一个执行BlockNestedloopjoin(linktext)的程序。基本上它所做的是,它将文件(比如10GB文件)中的内容读入buffer1(比如400MB),然后将其放入哈希表中。现在将第二个文件(比如10GB文件)的内容读入缓冲区2(比如100MB)并查看缓冲区2中的元素是否存在于哈希中。输出结果无关紧要。我现在只关心程序的效率。在这个程序中,我需要一次从两个文件中读取8个字节,所以我使用了longlongint。问题是我的程序效率很低。我怎样才能让它更有效率?//我使用g++-ohashhash.c-std=c++0x编译#include#include#include

c++ - make_signed<unsigned long>::type 是 int?

我使用的是VisualStudio2010,下面的代码让我有些困惑:#includeautox=std::make_signed::type();x将是int类型,但我预计会很长。我知道VS10中的int和long都是4字节整数。但是即使一个signedlong装进一个int,int对我来说也不是unsignedlong对应的signedinteger类型。所以我的问题是:这是错误/技术错误还是标准规范允许这种结果? 最佳答案 C++1120.9.7.3[meta.trans.sign]描述了make_signed:IfTnames

C++ signed 和 unsigned int 与 long long 速度

今天,我注意到几个简单的按位和算术运算的速度在int之间有显着差异。,unsigned,longlong和unsignedlonglong在我的64位电脑上。特别是,对于unsigned,以下循环的速度大约是其两倍至于longlong,这是我没想到的。intk=15;intN=30;intmask=(1(完整代码here)以下是计时(以秒为单位)(对于g++-O、-O2和-O3):1.834207723(int)3.054731598(longlong)1.584846237(unsigned)2.201142018(unsignedlonglong)这些时间非常一致(即1%的差值)。