标签: packed

打包结构是否可移植?

我在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上运行.)
  • 其他编译器是否支持具有相同内存布局的打包结构?用什么语法?

编辑:

  • 是的,我知道打包的结构是非标准的,但它们看起来很有用,可以考虑使用它们.
  • 我对C和C++都感兴趣,虽然我不认为GCC会以不同的方式处理它们.
  • 这些结构不是继承的,不会继承任何东西.
  • 这些结构只包含固定大小的整数字段和其他类似的打包结构.(我之前被浮子烧了......)

c c++ gcc struct packed

40
推荐指数
4
解决办法
5524
查看次数

什么是C中的"打包"结构?

我将为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)

包装是什么意思?

c microcontroller packed

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

c结构中的压缩位字段 - GCC

我在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 gcc struct packed bit-fields

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

Delphi中的数组和压缩数组有什么区别吗?

在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记录是不同的 - 它们可以'解包',因此由于字段的对齐,结构的大小大于字段大小的总和.)

arrays delphi alignment packed

15
推荐指数
1
解决办法
4551
查看次数

为什么我不能返回对打包字段的引用?

我使用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)

为什么我不能返回对打包字段的引用?

c++ gcc reference packed c++11

11
推荐指数
1
解决办法
3971
查看次数

PackedArrays有快速的产品操作吗?

在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

我怀疑这可能是不可能的,因为数值误差与乘法复合的方式.此外,该函数需要能够返回非机器浮动才有用.

wolfram-mathematica list numeric packed

8
推荐指数
1
解决办法
514
查看次数

min或gzip,哪个更好?

jquery-1.4.2.min.js是71.8KB通过工具压缩的同一文件,启用gzip,变为32.9 KB

哪个更好?如果是后者,为什么jQuery也不提供打包文件而不仅仅是未压缩和最小版本?

我的问题:一个被缩小并启用了gzip,另一个被缩小并打包并启用了gzip.我应该使用哪个?如果那个32KB,我想知道为什么jquery不提供缩小+打包版本,有什么特别的原因?

谢谢

javascript compression jquery packed

6
推荐指数
1
解决办法
2959
查看次数

除了"打包"记录之外什么都没有 - 我应该修复它吗?

在查看我们的传统Delphi 7程序中的一些代码时,我注意到在任何地方都有标记它的记录packed.这当然意味着记录是逐字节存储的,并且没有对齐以便CPU访问更快.包装似乎是盲目地完成的,试图超越编译器或其他东西 - 基本上重视几个字节的内存而不是更快的访问

一个示例记录:

TFooTypeRec = packed record
    RID                 : Integer;
    Description         : String;
    CalcInTotalIncome   : Boolean;
    RequireAddress      : Boolean;
end;
Run Code Online (Sandbox Code Playgroud)

我应该解决这个问题并使每条记录正常或"不"打包吗?或者使用现代CPU和内存这可以忽略不计,可能浪费时间?拆包可能导致任何问题吗?

delphi record delphi-7 packed

6
推荐指数
2
解决办法
1330
查看次数

最佳地打包递归模板化结构而不会失去对齐

我有一个由模板参数组成的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,t4
  • 添加填料场
  • GCC属性packedpayload
  • 也许其他人?

我觉得使用enable_if和SFINAE 这个问题有一个聪明的解决方案.谁能找到它?

为了说明这个问题,如果我们按原样使用上面的实现,那么using Foo = four_tuple<char,double,char,double>对于有效载荷和整体来说,我们的大小为32.如果我们只是声明有效载荷packed,那么它们double就不会很好地对齐.即重新安排场按递减顺序(在这里,A模板特double, double, char, char …

c++ memory-alignment packed c++11

6
推荐指数
1
解决办法
197
查看次数

打包结构中的解包结构是否自动打包?

打包结构中的解包结构是否由 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)

c c++ gcc struct packed

6
推荐指数
1
解决办法
112
查看次数