Tag: 结构

C vs C ++结构alignment

在最近的一次关于C ++结构体字段alignment的问题上,我被问到了这个问题,并且理论上C和C ++在结构打包中遵循相同的策略。 Hovewer,这是错误的假设。 面试官说,总的来说,C和C ++以不同的方式打包,我们不应该期待相反的结果。 恕我直言,这是奇怪的声明。 C ++中没有用于双C / C ++头文件的pack "C"限定符。 所以实际上,这可能意味着你不能在C ++中创build一个结构体,并把它传递给一个C库,因为通常它的字段将以不同的方式alignment,并且具有不同的偏移量。 但事实上,大多数程序员认真地依赖于这种互操作性,直到他们将一个指针转换为一个C POD结构为止,以及一些辅助方法引用C ++包装。 你能澄清这个问题吗?

使用Fabric在远程shell中运行()调用时是否可以捕获错误代码?

通常,一旦run()调用返回一个非零的退出代码,Fabric就会退出。 但是,对于一些电话,这是预期的。 例如,PNGOut在无法压缩文件时返回错误代码2。 目前我只能通过使用shell逻辑( do_something_that_fails || true或do_something_that_fails || do_something_else )来绕过这个限制,但我宁愿能够保持我的逻辑在纯Python(就像Fabric的承诺一样)。 有没有办法检查一个错误代码,并作出反应,而不是面料恐慌和死亡? 我仍然想要其他调用的默认行为,所以通过修改环境来改变它的行为似乎不是一个好的select(据我所知,只能用它来告诫它警告而不是死亡)。

在比较C ++中的结构时找不到==操作符

比较以下结构的两个实例,我收到一个错误: struct MyStruct1 { Position(const MyStruct2 &_my_struct_2, const int _an_int = -1) : my_struct_2(_my_struct_2), an_int(_an_int) {} std::string toString() const; MyStruct2 my_struct_2; int an_int; }; 错误是: 错误C2678:二进制'==':没有find操作符,它需要一个types为'myproj :: MyStruct1'的左手操作数(或没有可接受的转换) 为什么?

为什么在.NET中没有RAII?

主要是C ++开发人员,Java和.NET中RAII(资源获取初始化)的缺失一直困扰着我。 清理的责任从类作者转移到它的消费者(通过try finally或.NET的using构造 )的事实似乎显着地低下。 我明白了为什么在Java中不支持RAII,因为所有的对象都位于堆上,垃圾收集器固有地不支持确定性破坏,但是在引入值types( struct )的.NET中,我们有(看似)RAII的完美人选。 在堆栈上创build的值types具有明确定义的范围,并且可以使用C ++析构函数语义。 但是,CLR不允许值types具有析构函数。 我的随机searchfind了一个说法,如果一个值types被装箱,它属于垃圾收集器的pipe辖范围,因此其销毁变得不确定。 我觉得这个论点还不够强,RAII的好处足以说明一个具有析构函数的值types不能被装箱(或用作类成员)。 长话短说我的问题是 :有什么其他的原因价值types不能用于引入RAII到.NET? (或者你认为我关于RAII显而易见的优势的观点是有缺陷的?) 编辑:由于前四个答案已经错过了这个观点,我一定没有清楚地expression这个问题。 我知道 Finalize及其非确定性特征,我知道using构造,我觉得这两个选项比RAII差。 using是一个类的消费者必须记住的另一件事(有多less人忘记把一个StreamReader放在一个using块?)。 我的问题是关于语言devise的一个哲学问题,为什么它是这样,可以改进? 例如,对于generics确定性可破坏的值types,我可以使using和lock关键字是冗余的(可以通过库类实现): public struct Disposer<T> where T : IDisposable { T val; public Disposer(T t) { val = t; } public T Value { get { return val; } } ~Disposer() // Currently illegal { […]

C ++元组与结构

使用std::tuple和data-only struct是否有区别? typedef std::tuple<int, double, bool> foo_t; struct bar_t { int id; double value; bool dirty; } 从我在网上find的,我发现有两个主要的区别: struct更具可读性,而tuple有许多可以使用的通用函数。 应该有什么显着的性能差异? 另外,数据布局是否相互兼容(可互换)?

应该结构定义进入.h或.c文件?

我已经在头文件中看到了struct的完整定义,只是声明 – 对另一个方法有没有优势? 如果它有所作为,我通常在.h键入一个像这样的结构 typedef struct s s_t; 编辑 要清楚的是,这些选项是头文件中的声明和类中的定义,或者头文件中的声明和定义。 两者应该导致相同的可用性,即使是通过链接,不是吗? 我看到许多几乎重复,例如在这里,但没有完全匹配。 请纠正我,如果我在这方面的错误。

我怎样才能公开默认的成员在斯威夫特的结构初始化?

我有一个定义结构的swift框架: public struct CollectionTO { var index: Order var title: String var description: String } 但是,我似乎无法使用从导入库的另一个项目隐式成员明智的初始值设定项。 错误是'CollectionTO'无法初始化,因为它没有可访问的初始化程序。 即它没有给默认隐式成员明智的初始化公开关键字。 var collection1 = CollectionTO(index: 1, title: "New Releases", description: "All the new releases") 我不得不添加我自己的init方法,如下所示: public struct CollectionTO { var index: Order var title: String var description: String public init(index: Order, title: String, description: String) { self.index = […]

为什么HashSets的可空值的结构非常慢?

我调查了性能下降,并追踪到减缓HashSets。 我有可用作主键的可空值的结构。 例如: public struct NullableLongWrapper { private readonly long? _value; public NullableLongWrapper(long? value) { _value = value; } } 我注意到创build一个HashSet<NullableLongWrapper>非常慢。 下面是一个使用BenchmarkDotNet的例子:( Install-Package BenchmarkDotNet ) using System.Collections.Generic; using System.Linq; using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Configs; using BenchmarkDotNet.Jobs; using BenchmarkDotNet.Running; public class Program { static void Main() { BenchmarkRunner.Run<HashSets>(); } } public class Config : ManualConfig { public […]

你如何使用pip,virtualenv和Fabric来处理部署?

你的设置,你的技巧,最重要的是,你的工作stream程是什么? 这些工具很棒,但是仍然没有最佳实践,所以我不知道使用它们的最有效的方法是什么。 你使用PIP捆绑或总是下载? 你是否手工设置了Apache / Cherokee / MySQL,或者你有脚本吗? 你把一切都在virtualenv和使用–no-site-packages ? 你有几个项目使用一个virtualenv? 你使用Fabric的哪些部分(脚本的哪个部分是你的脚本)? 你把你的Fabric脚本放在客户端还是服务器上? 你如何处理数据库和媒体文件迁移? 你有没有需要像SCons这样的构build工具? 你的部署步骤是什么? 你多久执行一次? 等等

初始化一个结构为0

如果我有这样的结构: typedef struct { unsigned char c1; unsigned char c2; } myStruct; 什么是最简单的方法来初始化这个结构为0? 以下就足够了吗? myStruct _m1 = {0}; 或者我需要显式初始化每个成员为0? myStruct _m2 = {0,0};