我在Cortex-M4微控制器上有一些代码,并想用二进制协议与PC进行通信。 目前,我正在使用GCC特定packed属性的打包结构。 这是一个粗略的概述: struct Sensor1Telemetry { int16_t temperature; uint32_t timestamp; uint16_t voltageMv; // etc… } __attribute__((__packed__)); struct TelemetryPacket { Sensor1Telemetry tele1; Sensor2Telemetry tele2; // etc… } __attribute__((__packed__)); 我的问题是: 假设我在MCU和客户端应用程序上使用了完全相同的TelemetryPacket结构定义,那么上面的代码是否可以跨多个平台进行移植? (我对x86和x86_64感兴趣,需要它在Windows,Linux和OS X上运行。) 其他编译器是否支持具有相同内存布局的打包结构? 用什么语法? 编辑 : 是的,我知道打包的结构是非标准的,但它们似乎有用,足以考虑使用它们。 我对C和C ++都感兴趣,但我不认为GCC会以不同的方式处理它们。 这些结构不会被inheritance,也不会inheritance任何东西。 这些结构只包含固定大小的整数字段和其他类似的打包结构。 (我以前曾经被花车烧过)
我已经看到了以下两种在C API中声明不透明types的风格。 使用另一种风格有没有明显的优势? 选项1 // foo.h typedef struct foo * fooRef; void doStuff(fooRef f); // foo.c struct foo { int x; int y; }; 选项2 // foo.h typedef struct _foo foo; void doStuff(foo *f); // foo.c struct _foo { int x; int y; };
这里是非常简化的问题我有: enum node_type { t_int,t_double }; struct int_node { int值; }; struct double_node { 双重价值; }; struct node { 枚举node_typetypes; 联合{ struct int_node int_n; struct double_node double_n; }; }; int main(void){ struct int_node i; i.value = 10; struct node n; n.type = t_int; ñ。 int_n = i; 返回0; } 我不明白的是: $ cc us.c $ cc […]
我有一个值types的types构造函数的问题。 这个问题的启发是杰弗里·里希特(Jeffrey Richter)通过C#第3版在CLR中写的东西,他说(在第195页 – 第8章)你永远不应该在值types中实际定义一个types构造函数,因为有时候CLR不会调用它。 所以,例如(实际上是Jeffrey Richters的例子),即使通过查看IL,我也无法解决这个问题,为什么在下面的代码中没有调用types构造函数: internal struct SomeValType { static SomeValType() { Console.WriteLine("This never gets displayed"); } public Int32 _x; } public sealed class Program { static void Main(string[] args) { SomeValType[] a = new SomeValType[10]; a[0]._x = 123; Console.WriteLine(a[0]._x); //Displays 123 } } 所以,为types构造函数应用下面的规则,我不明白为什么上面的值types构造函数根本不被调用。 我可以定义一个静态值types的构造函数来设置types的初始状态。 一个types只能有一个构造函数 – 没有默认构造函数。 types构造函数是隐式私有的 JIT编译器检查这个AppDomain中是否已经执行了types的types构造函数。 如果不是,则会将调用发送到本地代码,否则不会按照它知道该types已被“初始化”。 所以…我只是不能解决为什么我看不到这种types的数组正在构build。 […]
我在XNA中玩弄,看到Vector3类使用公共字段而不是属性。 我尝试了一个快速的基准,发现对于一个struct的差异是相当戏剧性的(将两个向量加在一起,一亿次带有属性的2.0s和带有字段的1.4s)。 对于一个参考types,差异似乎并不大,但它在那里。 那么为什么呢? 我知道一个属性被编译成get_X和set_X方法,这会招致方法调用的开销。 但是,这些简单的getter / setter是不是总是被JIT内联? 我知道你不能保证JIT决定做什么,但是肯定这个概率是相当高的? 还有什么是在机器层面上将公共领域与财产分开的? 还有一件事我一直在想:一个自动实现的属性( public int Foo { get; set; } )如何比公共领域更好的OOdevise? 或者更好地说:这两个不同呢? 我知道,使它成为一个财产更容易与反思,但别的? 我敢打赌,这两个问题的答案是一样的。 顺便说一句:我正在使用的.NET 3.5 SP1,我相信固定的问题结构的方法(或结构的方法,我不知道)没有内衬,所以不是这样。 我想我至less使用它,这是肯定安装,但是,然后再次,我使用Vista的64位与SP1应该有DX10.1,除了我没有DX10.1 .. 另外:是的,我一直在运行发布版本:) 编辑 :我很欣赏快速答案的家伙,但我表示,我知道一个属性访问是一个方法调用,但我不知道为什么,可能是内联方法比直接字段访问速度慢。 编辑2 :所以我创build了另一个使用显式GetX()方法的结构(o我怎么不会错过我的Java日子),并执行相同的是否我禁用内联(通过[MethodImplAttribute(MethodImplOptions.NoInlining)] )或不,所以结论:非静态方法显然不是内联的,甚至不在结构上。 我认为有些例外,JIT可以优化虚拟方法。 为什么不能在不知道inheritance的结构上发生,因此方法调用只能指向一种可能的方法,对吗? 或者是因为你可以实现一个接口吗? 这真是一种耻辱,因为它真的会让我思考如何在性能关键的东西上使用属性,但是使用字段会让我感到肮脏,所以我不妨写下我在C中所做的事情。 编辑3 :我发现这个post关于完全相同的主题。 他的最终结论是,财产呼叫确实得到了优化。 我也可以发誓,我已经读了很多次,尽pipe是在IL中的callvirt ,简单的getter / setter属性将被内callvirt 。 那么我疯了吗? 编辑4 :里德·科普塞在下面的评论中发布了答案: 回复:编辑3 – 看到我更新的评论:我相信这是x86 JIT与x64 JIT问题。 在64位的JIT是不成熟的。 我希望随着更多的64位系统每天上网,MS会迅速改进。 […]
我正在尝试使用C#读取二进制数据。 我有关于我想要读取的文件中的数据布局的所有信息。 我能够读取数据“块大块”,即获得数据的前40个字节转换为一个string,获得下一个40个字节,… 由于至less有三个稍微不同的版本的数据,我想直接读取数据到一个结构。 它只是比“逐行阅读”更为合适。 我已经尝试了以下方法,但无济于事: StructType aStruct; int count = Marshal.SizeOf(typeof(StructType)); byte[] readBuffer = new byte[count]; BinaryReader reader = new BinaryReader(stream); readBuffer = reader.ReadBytes(count); GCHandle handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned); aStruct = (StructType) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(StructType)); handle.Free(); 该stream是一个已经开始读取的已打开的FileStream。 当使用Marshal.PtrToStructure时,我得到一个AccessViolationException。 该stream包含更多的信息比我试图读取,因为我不感兴趣的数据在文件的末尾。 结构是这样定义的: [StructLayout(LayoutKind.Explicit)] struct StructType { [FieldOffset(0)] public string FileDate; [FieldOffset(8)] public string FileTime; [FieldOffset(16)] public int […]
我在c ++中有以下类定义: struct Foo { int x; char array[24]; short* y; }; class Bar { Bar(); int x; Foo foo; }; 并希望在Bar类的初始化程序中将“foo”结构(及其所有成员)初始化为零。 这可以做到这一点: Bar::Bar() : foo(), x(8) { } …? 或者foo(x)在初始化列表中做了什么? 还是该结构甚至从编译器自动初始化为零?
通常我们可以为C ++结构定义一个variables,如 struct foo { int bar; }; 我们是否也可以为结构定义函数? 我们将如何使用这些function?
如果我使用这样的自动属性在C#中定义一个结构: public struct Address { public Address(string line1, string line2, string city, string state, string zip) { Line1 = line1; Line2 = line2; City = city; State = state; Zip = zip; } public string Line1 { get; protected set; } public string Line2 { get; protected set; } public string City { get; protected […]
最近在我的C肌肉工作,并通过我一直在努力的许多图书馆看,当然给了我一个很好的主意,什么是好的做法。 有一件事,我没有看到是一个函数,返回一个结构: something_t make_something() { … } 从我所吸收的是这样做的“正确的”方式: something_t *make_something() { … } void destroy_something(something_t *object) { … } 代码片段2中的架构比FAR更受欢迎。所以现在我问,为什么我会直接返回一个结构,就像在代码片段1中那样? 当我在两种select之间进行select时,我应该考虑哪些差异? 此外,这个选项如何比较? void make_something(something_t *object)