我在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__));
Run Code Online (Sandbox Code Playgroud)
我的问题是:
TelemetryPacket对MCU和客户端应用程序上的结构使用完全相同的定义,上述代码是否可以跨多个平台移植?(我对x86和x86_64很感兴趣,需要它在Windows,Linux和OS X上运行.)编辑:
我将为Microchip C30编译器编写一些C代码,我经常看到结构定义如下:
typedef struct __attribute__((__packed__))
{
IP_ADDR MyIPAddr; // IP address
IP_ADDR MyMask; // Subnet mask
IP_ADDR MyGateway; // Default Gateway
// etc...
} APP_CONFIG;
Run Code Online (Sandbox Code Playgroud)
包装是什么意思?
我在linux上使用c中的结构.我开始使用位字段和"打包"属性,我遇到了一个奇怪的行为:
struct t1
{
int a:12;
int b:32;
int c:4;
}__attribute__((packed));
struct t2
{
int a:12;
int b;
int c:4;
}__attribute__((packed));
void main()
{
printf("%d\n",sizeof(t1)); //output - 6
printf("%d\n",sizeof(t2)); //output - 7
}
Run Code Online (Sandbox Code Playgroud)
为什么两个结构 - 完全相同 - 采用不同的字节数?
在C/C++中你总是有
SizeOf(array[N] of T) = N * SizeOf(T);
Run Code Online (Sandbox Code Playgroud)
在Pascal/Delphi中,您可以使用'packed array'来确保上面的断言是正确的,但'packed'说明符对Delphi中的数组有什么实际价值吗?我无法创建一个'unpacked'数组的例子,数组似乎总是'打包':
type
A = array[0..2] of Byte;
B = array[0..99] of A;
C = packed record
C1, C2, C3: Byte;
end;
D = array[0..99] of C;
procedure TForm10.Button1Click(Sender: TObject);
begin
Assert(SizeOf(A) = 3);
Assert(SizeOf(B) = 300);
Assert(SizeOf(D) = 300);
end;
Run Code Online (Sandbox Code Playgroud)
(C/C++结构和Delphi记录是不同的 - 它们可以'解包',因此由于字段的对齐,结构的大小大于字段大小的总和.)
我使用g ++来编译带有压缩字段的代码.但是,我尝试返回对打包字段的引用时收到错误.
例:
struct __attribute__((packed)) Foo {
int* ptr;
uint16_t foo;
int*& getPtr(){
return ptr;
}
};
Run Code Online (Sandbox Code Playgroud)
产量错误:
test.cpp:22:14: error: cannot bind packed field ‘((Foo*)this)->Foo::ptr’ to ‘int*&’
return ptr;
Run Code Online (Sandbox Code Playgroud)
为什么我不能返回对打包字段的引用?
在Mathematica中,包含所有机器大小整数或浮点数的向量(或矩形数组)可以存储在打包数组中.这些对象占用的内存较少,而且某些操作的速度要快得多.
RandomReal尽可能生成一个打包数组.可以使用该Developer函数解压缩打包数组FromPackedArray
考虑这些时间
lst = RandomReal[1, 5000000];
Total[lst] // Timing
Plus @@ lst // Timing
lst = Developer`FromPackedArray[lst];
Total[lst] // Timing
Plus @@ lst // Timing
Out[1]= {0.016, 2.50056*10^6}
Out[2]= {0.859, 2.50056*10^6}
Out[3]= {0.625, 2.50056*10^6}
Out[4]= {0.64, 2.50056*10^6}
Run Code Online (Sandbox Code Playgroud)
因此,在打包阵列的情况下,对于非打包阵列来说,Total快许多倍,Plus @@但大约相同.请注意,Plus @@在打包的数组上实际上要慢一点.
现在考虑
lst = RandomReal[100, 5000000];
Times @@ lst // Timing
lst = Developer`FromPackedArray[lst];
Times @@ lst // Timing
Out[1]= {0.875, 5.8324791357*10^7828854}
Out[1]= {0.625, 5.8324791357*10^7828854}
Run Code Online (Sandbox Code Playgroud)
最后,我的问题是:Mathematica中有一个快速方法用于打包数组的列表产品,类似于Total?
我怀疑这可能是不可能的,因为数值误差与乘法复合的方式.此外,该函数需要能够返回非机器浮动才有用.
jquery-1.4.2.min.js是71.8KB通过此工具压缩的同一文件,启用gzip,变为32.9 KB
哪个更好?如果是后者,为什么jQuery也不提供打包文件而不仅仅是未压缩和最小版本?
我的问题:一个被缩小并启用了gzip,另一个被缩小并打包并启用了gzip.我应该使用哪个?如果那个32KB,我想知道为什么jquery不提供缩小+打包版本,有什么特别的原因?
谢谢
在查看我们的传统Delphi 7程序中的一些代码时,我注意到在任何地方都有标记它的记录packed.这当然意味着记录是逐字节存储的,并且没有对齐以便CPU访问更快.包装似乎是盲目地完成的,试图超越编译器或其他东西 - 基本上重视几个字节的内存而不是更快的访问
一个示例记录:
TFooTypeRec = packed record
RID : Integer;
Description : String;
CalcInTotalIncome : Boolean;
RequireAddress : Boolean;
end;
Run Code Online (Sandbox Code Playgroud)
我应该解决这个问题并使每条记录正常或"不"打包吗?或者使用现代CPU和内存这可以忽略不计,可能浪费时间?拆包可能导致任何问题吗?
我有一个由模板参数组成的4个字段的结构:
template <typename T1, typename T2, typename T3, typename T4>
struct __attribute__((aligned(8))) four_tuple {
typedef struct {
T1 t1;
T2 t2;
T3 t3;
T4 t4;
} payload;
payload p;
};
Run Code Online (Sandbox Code Playgroud)
每种类型T1,T2,T3,和T4,保证是原始类型或four_tuple<...>::payload类型.保证是递归的 - 您可以将结构视为编码其叶节点是基本类型的四叉树.
我的目标是使结构具有最小可能性sizeof,但条件是所有叶节点都正确对齐.允许优化的工具是类模板特化,使用:
t1,t2,t3,t4packed上payload我觉得使用enable_if和SFINAE 这个问题有一个聪明的解决方案.谁能找到它?
为了说明这个问题,如果我们按原样使用上面的实现,那么using Foo = four_tuple<char,double,char,double>对于有效载荷和整体来说,我们的大小为32.如果我们只是声明有效载荷packed,那么它们double就不会很好地对齐.即重新安排场按递减顺序(在这里,A模板特double, double, char, char …
打包结构中的解包结构是否由 GCC 自动打包?
换句话说,__packed__属性会自动传播到嵌套结构吗?
也就是说:
struct unpackedStruct{
int16_t field1;
int32_t field2;
// etc...
}
struct packedStruct{
int16_t field1;
struct unpackedStruct struct1; // <-- Is this struct packed?
// etc...
} __attribute__((__packed__));
Run Code Online (Sandbox Code Playgroud)