问题标签 [packed]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
7386 浏览

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

我使用 g++ 编译带有压缩字段的代码。但是,在尝试返回对打包字段的引用时收到错误消息。

例子:

产生错误:

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

0 投票
3 回答
628 浏览

c - tcc 中的打包结构

我正在尝试在 tcc C 编译器中进行打包结构。代码如下,应该支持__attribute __标签:

它适用于 gcc,但不适用于 tcc。我还尝试了 __attribute __((packed)) 和其他一些测试 - 没有一个有效。

0 投票
1 回答
1509 浏览

c++ - 打包一个包含字符串的结构

我刚刚了解了填充,我正在尝试对其进行一些测试,我尝试打包这个结构:

但我收到了这个警告:

这是否意味着包含的结构strings不能被打包?还有其他方法吗?如果是这样会影响性能吗?

0 投票
0 回答
136 浏览

java - COBOL Packed field 到分布式系统

我们正在将遗留系统转换为 Java 平台。在此期间,我们将文件从遗留系统发送到运行 Java 的分布式服务器。我们遇到了打包字段的问题。COBOL (EBCDIC) COMP-3 字段必须先操作为 BINARY,然后是 ASCII。但是,当将文件发送回大型机或将文件传输到旧系统进行进一步处理时,转换回打包文件变得繁琐且重复。

有没有人知道可以更无缝地帮助这种类型的操作的过程或功能。我们都已经准备好研究 Velocidata,它也有它的挑战。

0 投票
3 回答
3442 浏览

c - 如何在 GCC C 中获得对齐的打包结构数组?

在 GCC C 中,如何获得一个打包结构数组,其中数组中的每个条目都是对齐的?

(FWIW,这是在 PIC32 上,使用 MIPS4000 架构)。

我有这个(简化):

RADIO_PACKET 在内部打包。

然后我有 RADIO_PACKET_QUEUE,这是一个 RADIO_PACKET 队列:

我希望数组 q[] 中的每个 RADIO_PACKET 都从对齐的地址(模 4 地址)开始。

但是现在 GCC 没有对齐它们,所以当我尝试将 q[n] 读取为一个单词时会出现地址异常。例如,这给出了一个例外:

也许这是因为我将 RADIO_PACKET 声明为已打包的方式。

我希望每个 RADIO_PACKET 在内部保持打包,但希望 GCC 在每个数组元素之后根据需要添加填充,以便每个 RADIO_PACKET 从对齐的地址开始。

我怎样才能做到这一点?

0 投票
1 回答
302 浏览

c++ - Optimally packing a recursively templated struct without loss of alignment

I have a struct of 4 fields of types that come from template parameters:

Each type T1, T2, T3, and T4, is guaranteed to be a primitive type or a four_tuple<...>::payload type. The guarantees are recursive - you can think of the struct as encoding a quadtree whose leaf nodes are primitive types.

My goal is for the struct to have minimum possible sizeof, subject to the condition that all of the leaf nodes are properly aligned. The tools allowed for the optimization are class template specializations using:

  • reordering of fields t1, t2, t3, t4
  • addition of filler fields
  • gcc attribute packed on payload
  • maybe others?

I feel like there is a clever solution to this problem using enable_if and SFINAE. Can anyone find it?

To illustrate the problem, if we use the above implementation as-is using Foo = four_tuple<char,double,char,double>, we'll have a size of 32 for the payload and overall. If we simply declare the payload packed, the double's will not be well-aligned. A template specialization that reorders the fields in decreasing order (here, double, double, char, char) will give a payload and overall size of 24. But the extra 6 bytes it uses are wasteful, as can be seen by considering using Bar = four_tuple<Foo::payload,int,int,int>. With optimal packing Bar could fit in 32 bytes, but with this scheme it would require 40. Bluntly applying field-reordering with packed will result in misaligned int's in Bar - some filler is needed.

I know that in general restructuring the memory layout of a struct's fields can have performance implications due to cache considerations, and that in general those implications will be at least as significant as any potential gains from better packing. I'd like to explore the tradeoffs, though, and I can't really do that properly in my context without solving this problem.

0 投票
0 回答
489 浏览

c - 将打包结构分配给全局结构时的警告

我在(嵌入式)ARM 架构上运行。

我有一个结构Brown

一个压缩结构Abo,包含Brown

一个全局变量:

现在我想分配AboSent.Left给全局变量Dest(未打包):

编译器给了我错误:

现在,当我在中间使用局部变量时,它编译得很好,没有警告:

这是为什么?中间的局部变量是如何产生影响的?

我知道在传递未对齐的指针时会发生此警告,但这里它不是指针。

0 投票
1 回答
492 浏览

c - 获取嵌入式 PACKED_STRUCT 定义以在 g++ 下编译

我正在开发一个智能电表项目,ARM,keil 编译器。我想在 g++ 下编译一些更复杂的逻辑来运行回归测试。我遇到了一些定义我们购买的 WMBus 堆栈接口的包含文件的问题。

PACKED_STRUCT 在编译器敏感的包含文件中定义:

...

而且我总是收到以下错误消息:
错误:类型可能未在参数类型中定义

错误:参数声明中的 typedef 声明无效

除了编辑包含文件以删除 PACKED_STRUCT 之外,我无法解决这个问题。显然我不会直接编辑文件,我会复制它们,编辑它们,并使用 -I 指令让它在 G++ 下找到我修改过的文件

错误消息似乎是说您不能将类型声明为宏的参数?

请注意,即使我重新声明:

我在 g++ 中使用 -std=c++11 标志,但删除此标志并不能解决任何问题,但会使系统包含失败

有什么方法可以定义 PACKED_STRUCT 以使未修改的代码在 g++ 下编译?

0 投票
1 回答
54 浏览

oracle - 如何在 oracle 中为当前日期创建压缩数字样式

使用以下规则将日、月和年指定为三个 INTEGER 值,它们之间没有分隔符:

日和月部分必须有两位数。当日或月小于 10 时,必须以零开头。

对于任何年份,年份部分都可以有四位数字(例如,1997)。对于 1950 到 2049 范围内的年份,年份分量也可以有两位数(50 代表 1950,依此类推)。

您不能在日期组件之间使用任何分隔符。

示例:“240497”或“04241997”

0 投票
2 回答
589 浏览

c - 在 C 中不使用“PACKED”编译器指令打包数据

背景:这是一个 16 位 TI DSP(准确地说是 TMS320F2812)。DSP是小端的。编译器是 C2000(不支持 PACKED 指令)。我需要通过以太网从源到目的地通信几个不同大小的结构。问题是协议需要 PACKED 数据(填充字节也将被视为信息)。

我目前打算做什么:在结构中使用位域

疑问:在这个特定的结构中,“INT16U 长度”将从一个新的对齐内存地址开始(如果我的理解有误,请纠正我)。因此,在“INT8U 优先级”之后将有 (16 位 - (4+4) 位 =) 8 位的填充。

Q1 - >即使使用编译器指令“pack”也会发生这种情况吗?(当然这取决于编译器,但我的问题与我找不到信息的 c99 标准有关)。我发现 c99 提供了紧密的包装。但是有了这个定义,我不明白“INT16U 长度”是在“INT8U 优先级”之后还是在 8 位填充之后立即开始。

Q2 -> 结构内的数组不能分配位域。如果数组中有 8 位元素,那么数组中的每个元素都将再填充 8 位以与 16 位处理器对齐。

另一种替代解决方案是在传输(或接收)时使用 char* 指针指向结构。

Q3 -> 在这种情况下,我需要手动“组合”INT8U 通道和 INT8U 优先级。如果声明了许多结构,这将变得困难。如果这种理解是错误的,请纠正我。

Q4 - >请帮助我更优雅地解决问题。我需要打包数据(包括结构内的位域和数组),但我没有编译器指令。