Tag: C#的

为什么STL / Boost C ++编码风格与其他人不一样呢?

我是一个相当新手的C ++程序员,但是在我对语言有限的经验上,大多数标准的C ++风格指南(例如Google C ++风格指南 )都违背了stl和boost库中的实现。 例如,C ++标准库和Boost中的类名总是小写的,下划线用于分隔单词(例如std::vector , boost::unordered_map , std::map::const_iterator ),而我见过的大多数风格指南对于C ++倾向于CamelCase风格(例如TcpConnection或Int32 )。 这同样适用于方法。 标准库和Boost对类和方法使用相同的样式(例如std::map<>::get_equal("foo") ),而大多数样式指南主张使用pascalCase或CamelCase。 如果我们将它与Ruby这样的语言进行对比,那么大多数用户将遵循核心库中使用的约定,似乎很奇怪,标准C ++库和其他人的代码之间会有这样的区别。 有人知道为什么吗? 编辑:只是为了澄清,我只是谈论肤浅的文本风格(套pipe,使用下划线等),而不是实际的实施风格。

真的想在C#中使用CodeContracts

我终于开始追赶已经join到.NET 3.5 / 4.0框架中的所有新function。 最近几天我一直在与CodeContracts合作,我真的很想去喜欢它们。 我很好奇别人怎么看待C#中CodeContracts的实现? 具体来说,人们如何组织合同类的接口,合同不变约等方法? 我喜欢合同提供的validation,乍一看,他们看起来不错。 通过几行简单的代码,我甚至可以运行我的代码之前就可以获得一些很好的构build检查。 不幸的是,我很难理解代码合同在C#中的实现方式,他们比编写合同更加混乱了我的代码。 为了充分利用契约,我用假设和断言等方式乱抛我的代码(我知道有些人会说这是件好事)。 但是正如下面的一些例子所显示的那样,它将一条简单的线条变成了四条或五条线,并且在我看来,它并没有为替代方法(即断言,exception等)增加足够的价值。 目前,我最大的挫折是: 界面合同: [ContractClass(typeof(IInterfaceContract))] public interface IInterface { Object Method(Object arg); } [ContractClassFor(typeof(IInterface))] internal abstract class IInterfaceContract { private IInterfaceContract() { } Object IInterface.Method(Object arg) { Contract.Requires(arg != null); Contract.Ensures(Contract.Result<Object>() != null); return default(Object); } } 这对我来说就像是一个混乱,我希望有一个更清晰的方式来logging要求,无论是通过属性或某种forms的内置语言支持。 事实上,我必须实现一个实现我的接口的抽象类,以便我可以指定合约似乎充其量是乏味的。 代码Bloat: typeof(Action<>).MakeGenericType(typeof(Object); 需要几个假设来validation可用的信息。 我知道所有的分析器都知道它是在Type上运行的,因此必须在这个有限的知识上工作,但是仍然让我感到沮丧的是,一行代码要求我重写为 var genericAction […]

为什么我看到多个“线程0x22c8退出代码259(0x103)”消息

我在我的Winforms应用程序中得到了这些消息的一大堆,即使我从来没有明确地做任何线程。 为什么发生这种情况? 我已经四处寻找一个解释,但很难说这样的调查。 我正在使用Visual Studios 2013,这是我关心的debugging输出: The thread 0x23a4 has exited with code 259 (0x103). The thread 0x2884 has exited with code 259 (0x103). The thread 0x27ec has exited with code 259 (0x103). The thread 0x1978 has exited with code 259 (0x103). The thread 0x1534 has exited with code 259 (0x103). The thread 0x1ad8 has […]

“x is null”和“x == null”有什么区别?

在C#7中我们可以使用 if (x is null) return; 代替 if (x == null) return; 使用新的方法(前面的例子)比旧的语法有什么优点吗? 语义有什么不同? 只是一个品味的问题? 如果不是,何时使用这个或另一个。 参考 。

为什么std :: fill(0)比std :: fill(1)慢?

我在一个系统上观察到,当设置一个常数值0与一个常量值1或一个dynamic值相比时, std::fill在一个大的std::vector<int>上显着且一致地慢: 5.8 GiB / s vs 7.5 GiB / s 但是,对于更小的数据大小,结果是不同的,其中fill(0)更快: 使用多于一个线程,在4 GiB数据大小时, fill(1)显示的斜率更高,但达到比fill(0) (51 GiB / s vs 90 GiB / s)低得多的峰值: 这引起了第二个问题,为什么fill(1)的峰值带宽要低得多。 这个testing系统是双通道Intel Xeon CPU E5-2680 v3,设置为2.5 GHz(通过/sys/cpufreq ),带有8×16 GiB DDR4-2133。 我testing了GCC 6.1.0( -O3 )和Intel编译器17.0.1( -fast ),都得到了相同的结果。 GOMP_CPU_AFFINITY=0,12,1,13,2,14,3,15,4,16,5,17,6,18,7,19,8,20,9,21,10,22,11,23为组。 Strem / add / 24线程在系统上获得85 GiB / s。 我能够在不同的Haswell双套接字服务器系统上重现这种效果,但没有任何其他体系结构。 例如,在Sandy Bridge EP上,内存性能是相同的,而在caching中fill(0)要快得多。 这里是重现的代码: #include […]

编译器可以从堆栈优化到堆栈分配吗?

就编译器优化而言,是否合法和/或可能将堆分配更改为堆栈分配? 或者,这会打破如果规则 ? 例如,说这是代码的原始版本 { Foo* f = new Foo(); f->do_something(); delete f; } 编译器能够将其更改为以下内容 { Foo f{}; f.do_something(); } 我不这么认为,因为如果原始版本依赖于自定义分配器的话,这将会产生影响。 标准是否对此有专门的说明?

经验丰富的C程序员的C + +教程

我一直在C编程25年,但从未使用过C ++。 我现在需要学习C ++编程的基础知识。 任何人都可以推荐一个最适合我的在线教程(或者是一本书)。 谢谢。 编辑:我实际上只需要C ++来为一个庞大而旧的C程序添加一些肮脏的黑客的目的。 把整个程序转换成适当的OO代码在经济上是不可行的。 有些人批评这些build议的解决scheme是基于这样一个事实,即他们会导致我成为一个“C程序员,他知道一些C ++,却没有达到C ++的正确精神” – 但实际上这完全符合我的要求。

C / C ++中的单引号,双引号和sizeof('a')

我在C或C ++中查看单引号与双引号的问题。 我不能完全理解给出的解释,所以我写了一个程序: #include <stdio.h> int main() { char ch = 'a'; printf("sizeof(ch) :%d\n", sizeof(ch)); printf("sizeof(\'a\') :%d\n", sizeof('a')); printf("sizeof(\"a\") :%d\n", sizeof("a")); printf("sizeof(char) :%d\n", sizeof(char)); printf("sizeof(int) :%d\n", sizeof(int)); return 0; } 我使用gcc和g ++编译它们,这些是我的输出: GCC: sizeof(ch) : 1 sizeof('a') : 4 sizeof("a") : 2 sizeof(char) : 1 sizeof(int) : 4 克++: sizeof(ch) : 1 sizeof('a') : 1 […]

ConcurrentDictionary TryRemove何时会返回false

如果字典不包含给定键的值,还是会因为线程争用条件返回false而返回false,如另一个线程添加/更新的东西? 代码中的问题: ConcurrentDictionary<int, string> cd = new ConcurrentDictionary<int, string>(); // This might fail if another thread is adding with key value of 1. cd.TryAdd(1, "one"); // Will this ever fail if no other thread ever removes with the key value of 1? cd.TryRemove(1); 编辑:我认为它只会返回false,如果它不包含给定的键的值,但要绝对肯定。

为什么不能构造函数推导出模板参数?

template< class T > class Foo { public: Foo( T t ) { } }; int main () { int i = 0; Foo f( i ); } 在上面的代码中,编译器会抱怨在'f'之前缺less模板参数。 据我所知,从构造函数的参数中推导一个类的模板参数不是标准的一部分,但我的问题是为什么? 编译器是否具有隐含地实例化Foo<int>并调用其构造函数所需的全部信息? 编辑清楚,我打电话给一个int的构造函数(而不是一个short , long , void*等)