我最近一直在阅读Google Protocol Buffers,它允许在消息中使用各种标量值类型.
根据他们的文档,有三种类型的可变长度整数原语- int32,uint32和sint32.在他们的文档中,他们指出int32"编码负数的效率低 - 如果您的字段可能有负值,请sint32改用." 但是如果你有一个没有负数的字段,我认为uint32将是一个比使用更好的类型int32(由于额外的位和处理负数的CPU成本降低).
那么什么时候int32使用是一个很好的标量?文档是否意味着只有当您很少得到负数时它才是最有效的?或者它总是优先使用,sint32并uint32取决于该领域的内容?
(同样的问题也适用于这些标量的64位版本,以及:int64,uint64,和sint64,但我离开他们出了问题描述为可读性的缘故.)
我有一个类,它可以累积有关一组对象的信息,可以作为仿函数或输出迭代器.这允许我做以下事情:
std::vector<Foo> v;
Foo const x = std::for_each(v.begin(), v.end(), Joiner<Foo>());
Run Code Online (Sandbox Code Playgroud)
和
Foo const x = std::copy(v.begin(), v.end(), Joiner<Foo>());
Run Code Online (Sandbox Code Playgroud)
现在,理论上,编译器应该能够使用复制省略和返回值优化,以便只Joiner需要创建一个对象.然而,在实践中,该函数会生成一个操作副本,然后将其复制回结果,即使在完全优化的构建中也是如此.
如果我将仿函数创建为左值,则编译器会创建两个额外的副本而不是一个副本:
Joiner<Foo> joiner;
Foo const x = std::copy(v.begin(), v.end(), joiner);
Run Code Online (Sandbox Code Playgroud)
如果我笨拙地强制将模板类型强制转换为引用,它会传入引用,但无论如何都要复制它并返回对(现在已销毁的)临时副本的悬空引用:
x = std::copy<Container::const_iterator, Joiner<Foo>&>(...));
Run Code Online (Sandbox Code Playgroud)
我可以通过在样式的仿函数中使用对状态的引用而不是状态本身来使副本变得便宜std::inserter,从而导致类似这样的事情:
Foo output;
std::copy(v.begin(), v.end(), Joiner<Foo>(output));
Run Code Online (Sandbox Code Playgroud)
但是这使得不可能使用不可变对象的"功能"风格,而且通常不那么好.
有没有办法鼓励编译器忽略临时副本,或者让它一直通过引用并返回相同的引用?
我正在使用Visual Studio c ++ Compiler(2010),但该库具有不同的ANSI C和POSIX库函数的实现.
ANSI C函数和Windows CRT实现有什么区别?例如tzset()和/ _tzset()或setenv()ans有_setenv()什么区别?似乎以同样的方式做同样的事情......
我正在使用msvc(2010),我是否更喜欢Windows CRT实现?
编辑1
好吧,我希望以可移植的方式转换一个以UTC表示的结构tm time_t,但是没有可移植的方法来做到这一点.我要为不同的平台(Android,Linux,Windows,Windows CE)编写功能.
我已经看过这个使用的stackoverflow帖子setenv,getenv和tzset
EDIT2
不幸的是,经过一些测试,我发现getenv("TZ")在Windows上返回一个空指针.但为什么如此困难将UTC时间结构转换为time_t?
编辑3
从Boost中我发现了boost/chrono/io/time_point_io.hpp中的这段代码.希望这对我有所帮助.
inline int32_t is_leap(int32_t year)
{
if(year % 400 == 0)
return 1;
if(year % 100 == 0)
return 0;
if(year % 4 == 0)
return 1;
return 0;
}
inline int32_t days_from_0(int32_t year)
{
year--;
return 365 * year …Run Code Online (Sandbox Code Playgroud) 我以为.Net代码被编译成MSIL,所以我总是想知道黄色屏幕是如何产生错误的代码的.如果它正在执行已编译的代码,编译器如何能够从错误消息中的源文件生成代码?
随意编辑这个问题/标题,我知道它没有意义.
我已将我的移动设备上的数据库迁移远离VistaDB,因为它太慢了.我现在使用ProtoBuf在存储卡上创建一系列平面文件,唯一的问题是显然没有加密.
哪种加密方法最适合ProtoBuf?我基本上将一组数据实体序列化到一个文件中,然后从File反序列化回到我的集合中.我认为加密的最佳位置是在读/写的FileStream中.
数据将包含NI编号,名称和地址,因此必须是安全的.任何想法的人?
encryption serialization compact-framework protocol-buffers .net-2.0
在Visual Studio中,我刚刚创建了一个简单的单元测试来测试我编写的方法.我想检查代码覆盖率,但代码覆盖率窗口只表示"未对此测试运行启用代码覆盖率".为什么?注意:
然而,每次运行相关测试时,我仍然会收到"此测试运行未启用代码覆盖率"的消息.如何一劳永逸地启用代码覆盖?
我对这个很困惑.
我想抓住当前时间,而不是根据条件,我想将所需时间添加到当前时间.例如.
current time = 06:47:10
//or should i hv to change this format to "2011-03-26 06:47:10 GMT"
if(a= 1 and b= min )
{ //add 1 min to
current time
}
else if(a= 1 and b= hour)
{ //add 1
hour to current time
}
else if(a= 1 and b=week )
{ //add 1
week to current time
}
Run Code Online (Sandbox Code Playgroud)
只需要将上述条件的输出添加到当前时间.
请指导我这个.
问候
我想在第三方库(DLL)的运行时外部XAML样式期间加载.在本教程中,他们使用:
Application.LoadComponent(new Uri("/WpfSkinSample;component/Skins/" + name + ".xaml", UriKind.Relative)) as ResourceDictionary;
Run Code Online (Sandbox Code Playgroud)
加载新样式.
但是我不知道第三方库中的XAML名称,所以我正在寻找一种方法来获取它们并将它们加载到我的应用程序中.
谢谢你的帮助.
编辑: 感谢andyp,我做了以下工作:
public void LoadXaml(String Assemblypath)
{
var assembly = Assembly.LoadFile(Assemblypath);
var stream = assembly.GetManifestResourceStream(assembly.GetName().Name + ".g.resources");
var resourceReader = new ResourceReader(stream);
foreach (DictionaryEntry resource in resourceReader)
{
if (new FileInfo(resource.Key.ToString()).Extension.Equals(".baml"))
{
Uri uri = new Uri("/" + assembly.GetName().Name + ";component/" + resource.Key.ToString().Replace(".baml", ".xaml"), UriKind.Relative);
ResourceDictionary skin = Application.LoadComponent(uri) as ResourceDictionary;
this.Resources.MergedDictionaries.Add(skin);
}
}
}
Run Code Online (Sandbox Code Playgroud)