使用GCC,如果您switch在某个enum值上并且其中一个枚举缺少一个case语句,则会发出警告.当您添加default项目时,将不再发出警告,这在一般情况下是有意义的.
有没有办法使用一个default语句,如果不enum涵盖所有值,仍然会有警告?由于我的函数可能会处理不纯的输入,我想要涵盖一般情况,但仍然会收到关于错过枚举情况的编译器警告.
目前我最终在switch语句后分配了一个默认值.
有人可以提供一个如何使用QuantLib复制Excel/OpenOffice YIELD和PRICE函数的示例吗?
我有一些例子,但我还不太清楚所有的设置.当我尝试更改某些值时,我会得到零或一些荒谬的值.理想情况下,我想创建与YIELD/PRICE函数等效的c ++.
在我的第一步中,我不需要在Excel日期建模中复制缺陷.我可以等到以后才能生成完全相同的副本.虽然如果你知道这也很棒.
PRICE 例如,在OpenOffice中:
PRICE("2008-02-15","2010-11-15",5%,7%,100,2,1) = 95.068419616675
Run Code Online (Sandbox Code Playgroud)
我的QuantLib代码能够获得95.066759有点偏差.至少我有基本的价格函数,我想现在得到一个完全匹配的结果.
我不能轻易包含所有包装代码,但基本代码如下.
#include <ql/time/calendar.hpp>
#include <ql/time/daycounters/actualactual.hpp>
#include <ql/time/daycounters/actual365fixed.hpp>
#include <ql/time/schedule.hpp>
#include <ql/time/calendars/unitedstates.hpp>
#include <ql/time/calendars/nullcalendar.hpp>
#include <ql/settings.hpp>
#include <ql/handle.hpp>
#include <ql/termstructures/yield/flatforward.hpp>
#include <ql/instruments/bonds/fixedratebond.hpp>
#include <ql/pricingengines/bond/discountingbondengine.hpp>
#include <ql/utilities/dataformatters.hpp>
#include <iostream>
#include <iomanip>
#include "boost/date_time/gregorian/gregorian.hpp"
using namespace QuantLib;
Date convert_date( boost::gregorian::date const & date )
{
unsigned mon = date.month();
return Date( date.day(), Month(mon), date.year() );
}
shared_ptr<Bond> create_bond( boost::gregorian::date const & settlement_, boost::gregorian::date const & …Run Code Online (Sandbox Code Playgroud) 我想知道两种不同类型的特定类型的演员之间是否存在特定的,基于标准的差异.特别是,给定:类型T和变量T * object是:
intptr_t opaque = reinterpret_cast<intptr_t>( object );
T * result = reinterpret_cast<T*>( opaque );
Run Code Online (Sandbox Code Playgroud)
相当于:
void * opaque = static_cast<void*>( object );
T * result = static_cast<T*>( opaque );
Run Code Online (Sandbox Code Playgroud)
我只关心result它,它是否保证是相同的值,相当于object任何类型的原始值T?我不关心中间件的位模式opaque,因为我认为标准在技术上允许它们在每种情况下都不同(尽管没有理智的编译器会有不同的结果).
请注意,我不感兴趣的一般情况下,static_cast对reinterpret_cast,我很好地理解.我感兴趣是在上非常特殊的情况下-从标准导致分配特殊的逻辑来static_cast,并void*使得它的行为类似reinterpret_cast.(StackOverflow上有几个相关的问题,但它们更通用,我认为我的场景非常具体)
除了风格和偏好之外,是否有任何技术原因可以解决为什么应该使用一种形式?或者是否保证,所有人T都能产生相同的最终result变量?
我正在做一些舍入计算并发生了一个问题.对于给定的浮点类型,如何表示小于1的最大数量?
也就是说,我怎么写/代表值x,使得x < 1, x + y >= 1任何y > 0.
在级分,这将是x = (q-1)/q其中q是精确的类型.例如,如果您以1/999增量计数,那么x = 998/999.
对于给定的类型(float,double,long double),如何x在代码中表达值?
我也想知道这个值是否真的存在于所有的值中y.也就是说,随着y's指数变小,也许这种关系不再成立.因此,对某些范围限制的答案y也是可以接受的.(x我想要的价值仍然存在,这种关系可能无法正确表达.)
似乎不允许使用auto关键字声明不同类型的多个变量.我无法弄清楚标准中可能会阻止它的措辞.
auto i = 1, j = 1.0; //deduction failure (several compilers)
Run Code Online (Sandbox Code Playgroud)
从历史上我理解,因为你只有一个decl-specifier-spec.但是,标准中的规则似乎并未排除,实际上它们鼓励,这auto可能是每种规则的不同类型.考虑以下段落:
8-3 声明中的每个init-declarator都会被单独分析,就好像它本身就在声明中一样.
7.1.6.4-7如果声明符列表包含多个声明符,则每个声明的变量的类型如上所述确定.[...]
即使没有auto所有变量都需要具有相同的类型,因为某些修饰符*可以单独应用于每个声明符.现在看来,措辞允许每个auto声明者是完全不同的类型.
哪一段会禁止这个?
我已经看过标准但是没有找到任何迹象表明只是写入内存会被视为可观察的行为.如果不是,那就意味着编译的代码不需要实际写入该内存.如果编译器选择优化此类访问,则涉及映射器内存或共享内存的任何内容都可能无效.
1.9-8似乎定义了非常有限的可观察行为,但表明实现可能定义更多.可以假设任何质量编译器都会将修改内存视为可观察行为吗?也就是说,它可能无法保证原子性或排序,但确保最终会写入数据.
那么,我是否忽略了标准中的某些内容,或者只是编译器决定要写入内存?
来自当前或C++ 0x标准的语句是好的.请注意我不是在谈论通过函数访问内存,我的意思是直接访问,例如将数据写入指针(可能通过mmap或其他库函数检索).
在下面的示例中,如果我们忽略互斥锁一秒钟,复制省略可以消除对复制构造函数的两次调用.
user_type foo()
{
unique_lock lock( global_mutex );
return user_type(...);
}
user_type result = foo();
Run Code Online (Sandbox Code Playgroud)
现在复制省略的规则没有提到线程,但我想知道它是否应该实际跨越这些边界.在上面的情况中,逻辑抽象机器内部线程中的最终副本发生在互斥锁释放后.但是,如果省略了副本,则结果数据结构在互斥锁中初始化,因此它在互斥锁释放之前发生.
我还没有想到一个具体的例子,复制省略如何真正导致竞争条件,但是对记忆序列的干扰似乎可能是个问题.任何人都可以明确地说它不会导致问题,或者有人可以产生一个确实可以破坏的例子吗?
为了确保答案不只是解决一个特殊情况,请注意,如果我有一个类似的声明,复制省略(根据我的阅读)仍然允许发生new (&result)( foo() ).也就是说,result不需要是堆栈对象.user_type本身也可以使用线程之间共享的数据.
答:我选择了第一个答案作为最相关的讨论.基本上,因为标准说elision可以发生,程序员只要在跨同步边界发生时就要小心.没有迹象表明这是有意还是无意的要求.我们仍然缺乏任何可能出错的例子,所以也许这不是问题.
在的C++ 0x草案有围栏的概念似乎很明显,从围墙的CPU /芯片级的概念,或者说什么linux内核的家伙想到的围栏.问题在于草案是否真的意味着一个极其受限制的模型,或者措辞是否很差,它实际上意味着真正的围栏.
例如,在29.8 Fences下它表示如下:
如果存在原子操作X和Y,则释放围栏A与获取围栏B同步,两者都在某个原子对象M上操作,使得A在X之前被排序,X修改M,Y在B之前被排序,并且Y读取该值如果是释放操作,则由X写入或由假设释放序列中的任何一方写入的值X将结束.
它使用这些术语atomic operations和atomic object.草案中定义了这样的原子操作和方法,但它仅仅意味着那些吗?一个释放栅栏听起来像一个店围栏.在围栏之前不保证写入所有数据的商店围栏几乎是无用的.类似于装载(获取)围栏和完整围栏.
那么,C++ 0x中的栅栏/栅栏是否适当的栅栏和措辞是否非常差,或者它们是否如所描述的那样极其受限制/无用?
就C++而言,假设我有这个现有的代码(假设现在可以使用围栏作为高级构造 - 而不是在GCC中使用__sync_synchronize):
Thread A:
b = 9;
store_fence();
a = 5;
Thread B:
if( a == 5 )
{
load_fence();
c = b;
}
Run Code Online (Sandbox Code Playgroud)
假设a,b,c的大小在平台上具有原子拷贝.以上意味着c只会被分配9.注意我们并不关心线程B何时看到a==5,只是当它看到它时b==9.
C++ 0x中保证相同关系的代码是什么?
答案:如果您阅读我选择的答案和所有评论,您将获得情况的要点.C++ 0x似乎强制您使用带栅栏的原子,而普通硬件栅栏没有此要求.在许多情况下,只要sizeof(atomic<T>) == sizeof(T)和,这仍然可以用来代替并发算法atomic<T>.is_lock_free() == true.
不幸的是,这is_lock_free …
如果我调用一个具有volatile参数的函数,并且该参数未被使用,那么编译器是否必须生成参数?
void consume( volatile int ) { }
...
consume( some_expr );
Run Code Online (Sandbox Code Playgroud)
海湾合作委员会确实对此表示敬意,但我不确定标准中的挥发性措辞是否需要这样做.在我看来,GCC做的是正确的 - 这在逻辑上是对volatile变量的赋值,因此不应该被省略(根据c ++标准的1.9-8)
注意:这样做的目的是防止优化器删除代码评估.也就是说,它some_expr需要进行评估.它允许表达式进行优化,但确保它实际执行.
我已经添加了C和C++作为标签作为答案,如果有任何差异,我会感兴趣.我不认为会有.
答案:我选择了第一个,因为我认为这是标准的正确实际实现.然而,史蒂夫的哲学观点非常有趣,实际上可能意味着标准是模棱两可的.
可能重复:
OpenGL着色器的显式与自动属性位置绑定
在我的另一个问题中,其中一个答案表明我应该使用glBindAttribLocation并且不允许着色器编译器分配自己的索引.我想知道为什么这是一个推荐的做法,它有什么优点(或者说它没有使用它有什么缺点)?
我明白如果我有多个共享属性的程序,这是有道理的,因为我可以在程序之间切换而不必重置这些属性.但是,对于未共享的属性,或者如果我的程序不使用此类共享,我不认为有必要显式绑定索引.