小编Bil*_*eal的帖子

null终止字符串的基本原理是什么?

尽管我喜欢C和C++,但我还是忍不住在选择空终止字符串时不知所措:

  • 在C之前存在长度前缀(即Pascal)字符串
  • 通过允许恒定时间长度查找,长度前缀字符串使得几种算法更快.
  • 长度前缀字符串使得更容易导致缓冲区溢出错误.
  • 即使在32位机器上,如果允许字符串为可用内存的大小,则长度前缀字符串仅比空终止字符串宽三个字节.在16位机器上,这是一个字节.在64位机器上,4GB是一个合理的字符串长度限制,但即使你想将它扩展到机器字的大小,64位机器通常有足够的内存使额外的七个字节排序为null参数.我知道最初的C标准是针对极其糟糕的机器(就内存而言)而写的,但效率论证并没有把我卖给我.
  • 几乎所有其他语言(即Perl,Pascal,Python,Java,C#等)都使用长度前缀字符串.这些语言通常在字符串操作基准测试中胜过C,因为它们对字符串更有效.
  • C++对std::basic_string模板进行了一些纠正,但是期望空终止字符串的普通字符数组仍然很普遍.这也是不完美的,因为它需要堆分配.
  • 空终止字符串必须保留一个字符(即null),该字符不能存在于字符串中,而长度前缀字符串可以包含嵌入的空值.

这些事情中的一些最近比C更明显,因此C对于不了解它们是有意义的.然而,在C出现之前,有几个很平常.为什么选择空终止字符串而不是明显优越的长度前缀?

编辑:由于一些人在我的效率点上询问事实(并且不喜欢我已提供的事实),他们源于以下几点:

  • 使用空终止字符串的Concat需要O(n + m)时间复杂度.长度前缀通常只需要O(m).
  • 使用空终止字符串的长度需要O(n)时间复杂度.长度前缀为O(1).
  • length和concat是迄今为止最常见的字符串操作.在某些情况下,空终止字符串可以更有效,但这些情况发生得更少.

从下面的答案中,这些是空终止字符串更有效的一些情况:

  • 当你需要切断字符串的开头并需要将它传递给某个方法时.即使您被允许销毁原始字符串,也无法在长度前缀的常量时间内执行此操作,因为长度前缀可能需要遵循对齐规则.
  • 在某些情况下,您只需按字符循环字符串,就可以保存CPU寄存器.请注意,这仅适用于您尚未动态分配字符串的情况(因为您必须释放它,因此必须使用您保存的CPU寄存器来保存您最初从malloc和朋友那里获得的指针).

以上都不像长度和连续那样常见.

在下面的答案中还有一个断言:

  • 你需要切断字符串的结尾

但这个不正确 - 它与null终止和长度前缀字符串的时间相同.(Null终止字符串只是在你希望新结束的地方粘贴一个空值,长度前缀只是从前缀中减去.)

c c++ string null-terminated

272
推荐指数
12
解决办法
2万
查看次数

如何使用反射获取调用方法名称和类型?

可能重复:
如何找到调用当前方法的方法?

我想编写一个方法来获取调用方法的名称,以及包含调用方法的类的名称.

有可能用C#反射吗?

c# reflection

155
推荐指数
5
解决办法
11万
查看次数

NTFS连接点和符号链接有什么区别?

在较高的层面上,NTFS连接点符号链接之间唯一明显的区别是,连接只能是目录,而允许SymLinks也是目标文件.

两者之间还存在哪些其他差异?

(注意,我已经看到了这个问题,我正在寻找的是有点不同 - 这个问题正在寻找一个赞成和反对的列表,我正在寻找一组技术差异)

windows symlink ntfs

126
推荐指数
6
解决办法
7万
查看次数

如何深度复制DateTime对象?

$date1 = $date2 = new DateTime();
$date2->add(new DateInterval('P3Y'));
Run Code Online (Sandbox Code Playgroud)

现在$date1$date2包含相同的日期 - 三年后.我想创建两个单独的日期时间,一个用字符串解析,另一个用三年时间添加到字符串中.目前我已经像这样破解了它:

$date2 =  new DateTime($date1->format(DateTime::ISO8601));
Run Code Online (Sandbox Code Playgroud)

但这似乎是一个可怕的黑客.深度复制DateTime对象是否有"正确"的方法?

php datetime

114
推荐指数
4
解决办法
7万
查看次数

Private设置对MSBuild项目文件中的ProjectReference执行了什么操作?

我前几天在项目文件中看到了这个:

<ProjectReference Include="Foo\Bar\Baz.csproj">
    <Project>{A GUID HERE}</Project>
    <Name>Baz</Name>
    <Private>False</Private> <!-- ??? -->
    <ReferenceOutputAssembly>False</ReferenceOutputAssembly>
</ProjectReference>
Run Code Online (Sandbox Code Playgroud)

a中的每个节点ProjectReference似乎都是自解释的(引用的项目文件,GUID,要在解决方案资源管理器中显示的名称,以及当前项目是否应该链接到引用的项目)Private,并且" 公共MSBuild项目项"页面没有t记录这个值.(有一个Private文件化的设置Reference,而不是ProjectReference-但它有Never,AlwaysPreserveNewest设置,而不是真假)

这个设置有什么作用?

msbuild visual-studio

103
推荐指数
1
解决办法
3万
查看次数

关系数据库和非关系数据库之间有什么区别?

我知道像MySQL,PostgreSQL和MS SQL Server这样的解决方案是关系数据库系统,NoSQL,MongoDB等是非关系型DBMS.

但是,这两种系统有什么区别?

Layman条款是优选的.

谢谢.

non-relational-database relational-database

78
推荐指数
5
解决办法
10万
查看次数

如何并行运行NUnit测试?

我有一个使用NUnit编写的大型验收测试(每个测试约10秒)测试套件.我想利用我的机器都是多核盒的事实.理想情况下,我可以在每个核心运行一个测试,与其他测试无关.

有PNUnit,但它是为测试线程同步问题和类似的东西而设计的,我没有看到一个明显的方法来实现这一点.

是否有可用于并行运行测试的开关/工具/选项?

nunit

77
推荐指数
4
解决办法
4万
查看次数

如何保护.NET程序集免受反编译?

我开始使用C#时学到的第一件事就是最重要的一件事.您可以使用Reflector或其他工具反编译任何.NET程序集.许多开发人员都不知道这个事实,当我向他们展示他们的源代码时,他们中的大多数都感到震惊.

防止反编译仍然是一项艰巨的任务.我仍在寻找一种快速,简便,安全的方法.我不想混淆我的代码,所以我的方法名称将是a,b,c左右.反射器或其他工具应该无法将我的应用程序识别为.NET程序集.我已经了解了一些工具,但它们非常昂贵.有没有其他方法来保护我的应用程序?

编辑:

我的问题的原因不是防止盗版.我只想阻止竞争对手阅读我的代码.我知道他们会,他们已经做到了.他们甚至告诉过我.也许我有点偏执,但商业竞争对手阅读我的代码并不能让我感觉良好.

.net c# reflector decompiling

68
推荐指数
6
解决办法
10万
查看次数

有什么正当理由使一元运算符超载?

好吧,我受到启发,做了一些冲击.似乎超载operator&导致了不小的痛苦.

重载它有哪些合法案例?

(不能说我曾经那样做过......)

c++ operator-overloading

68
推荐指数
5
解决办法
3819
查看次数

如何在引擎盖下实施例外?

几乎每个人都使用它们,但很多人,包括我,只是认为他们只是工作是理所当然的.

我正在寻找高品质的材料.我使用的语言是:Java,C,C#,Python,C++,所以这些对我来说最感兴趣.

现在,C++可能是一个很好的起点,因为你可以用这种语言抛出任何东西.

此外,C接近装配.如何使用纯C结构模拟异常而不使用汇编?

最后,我听到一则传言,由于速度考虑,谷歌员工不会对某些项目使用例外.这只是谣言吗?没有它们,如何才能实现重大成就?

谢谢.

c c++ python exception

64
推荐指数
6
解决办法
7653
查看次数