bit-fields 相关问题

位字段用于将多个逻辑值紧凑地存储为短的一系列位,其中每个单个位可以被单独寻址。

带有位字段的 C 风格结构如何在 Rust #[repr(C)] 结构中表示?

我有一个 C 结构体定义为: 结构 my_c_s { u_char *ptr; 无符号flag_a:1; 无符号flag_b:1; int some_num; } flag_a 和 flag_b 会怎样

回答 2 投票 0

如何用C实现INT40?

如何用C语言实现INT40?是一个5字节的有符号整型变量,可以进行正常的加减乘除吗? #包括 结构体INT40 { ...

回答 1 投票 0

与位域的结构对齐

为什么sizeof(A)是12? 它应该是:float(4) + x_0-pad(2) + y_1(2) = 8 如果它全部对齐浮动,我该如何避免这种情况? 结构A { int x_0 : 1; int x_1 : 1; int x_2 : 1; int x_3 :...

回答 1 投票 0

无法获取位域地址

为什么不能获取位域的地址? 如何创建指向位域的指针? 这是代码... 结构位域{ 无符号整型:1; 无符号整型 b: 1; 无符号整型 c: 1; 取消签名...

回答 5 投票 0

在单个字节中使用位字段

我熟悉在处理器之间通信时使用位字段的问题 - 请参阅 C/C++:强制位字段顺序和对齐以及为什么字节顺序会导致问题。 但我的问题...

回答 1 投票 0

是否可以使用位字段数组?

我很好奇,是否可以使用位字段数组?喜欢: 结构体 { 无符号整型 i[5]: 4; };

回答 5 投票 0

C++ - 如何使用位域

所以我最近遇到了这样的事情 无符号字符ch:7; 在结构内部。我读了一点。显然这些被称为位字段。它们用于设置数据的宽度...

回答 1 投票 0

如何选择位标志值?

我有一组选项,一些是正交的(可以以任何组合进行组合),一些是排他的(只允许使用该组中的一个),并且需要选择一组枚举值以便可以将它们组合起来.. .

回答 7 投票 0

了解 C/C++ 中的结构大小变化:成员排序和数据对齐的影响

为什么 struct bit_man1 的大小为 8 个字节,而 struct bit_man2 的大小为 4 个字节,即使这两个结构包含相同的类型和数据量?考虑定义的结构

回答 1 投票 0

根据基础类型宽度,位域的行为是否存在差异?

我正在定义一些寄存器(它们都是 32 位宽)以使用位域与硬件外设接口。起初,我通过混合 uint8_t、uint16_t 和 uint32_t 类型来定义所有内容。对于e...

回答 1 投票 0

位字段可移植性

我在这里读到位字段不可移植。这是否意味着下面定义位字段的代码(代码取自此处)无法在某些机器上编译? 如果是这样,那为什么呢? #包括<

回答 4 投票 0

C 结构解释与位域的配合不正确

我需要使用不同的 C 结构(网络头描述符)对内存中一个字节的 2 位(来自线路)进行相同的解释。这是最小的可重现示例: #包括<...

回答 2 投票 0

C23字节顺序宏可以用来确定位域的布局吗?

我一直在阅读有关 C 标准的新增内容,并且遇到过用于确定编译时字节顺序的宏。 然而该标准仍然规定 分配顺序...

回答 1 投票 0

offsetof 和 sizeof 类似位字段的功能

结构和类有 offsetof 宏和 sizeof 运算符。 有没有办法获得位字段的类似功能,以便位字段成员的位偏移量和位大小可以是...

回答 3 投票 0

结构位域上的 std::atomic

我正在修改一些现有的开源库,并且有一个包含位字段的结构(例如名为 Node),例如 结构节点{ std::atomic 大小:30; std::原子 我正在修改一些现有的开源库,并且有一个包含位字段的结构(例如名为 Node),例如 struct Node { std::atomic<uint32_t> size:30; std::atomic<uint32_t> isnull:1; }; 为了满足我的需求,这些字段需要是原子的,所以我希望为此使用 std::atomic 并面临编译时错误: bit-field 'size' has non-integral type 'std::atomic<uint32_t>' 根据文档,有一组受限制的类型可用于 std::atomic 任何人都可以建议/了解如何在对现有源代码影响最小的情况下获得原子字段的功能吗? 提前致谢! (1) 您可以使用 这个示例 通过#defining 位来操作原子整数的位。 (2) 使用需要原子性的位域在编程上不太理想,但您可以牺牲 8 位并使用并集在位域中插入 std::atomic_flag(锁)。 每次访问该结构时都可以手动旋转锁定。但是,代码的性能应该比使用 std::mutex 和 std::unique_lock 创建、锁定、解锁、销毁更好。此代码可能会浪费大约 10-30 个时钟周期来启用低成本多线程。 PS。确保下面保留的 8 位不会被处理器的字节序结构弄乱。您可能必须在末尾定义大端处理器。我只在 Intel CPU 上测试了这段代码(始终是小端)。 // Use when the operation is quick to avoid mutex locks, // but too long to fit into a single atomic operation, #include <iostream> #include <atomic> #include <thread> union Data { std::atomic_flag access = ATOMIC_FLAG_INIT; // one byte struct { typedef unsigned short ushort; ushort reserved : 8; ushort count : 5; ushort ready : 1; ushort mult : 2; } bits; }; class SpinLock { public: inline SpinLock(std::atomic_flag &access, bool locked=true) : mAccess(access) { if(locked) lock(); } inline ~SpinLock() { unlock(); } inline void lock() { while (mAccess.test_and_set(std::memory_order_acquire)) { } } // each attempt will take about 10-30 clock cycles inline bool try_lock(unsigned int attempts=0) { while(mAccess.test_and_set(std::memory_order_acquire)) { if (! attempts) return false; -- attempts; } return true; } inline void unlock() { mAccess.clear(std::memory_order_release); } private: std::atomic_flag &mAccess; }; void aFn(int &i, Data &d) { SpinLock lock(d.access, false); // ... some code... // manually locking/unlocking can be tighter lock.lock(); if (d.bits.ready) { ++d.bits.count; } d.bits.ready ^= true; // alternate each time lock.unlock(); // ... some other code... } void aFn2(int &i, Data &d) { // When you need to lock the entire function SpinLock lock(d.access); if (d.bits.ready) { d.bits.count += d.bits.mult; } d.bits.ready ^= true; ++ d.bits.mult; } // returning will free up the lock as well int main(void) { Data f; f.bits.count = 0; f.bits.ready = true; f.bits.mult = 1; std::thread *p[8]; for (int i = 0; i < 8; ++ i) { p[i] = new std::thread([&f] (int i) { aFn(i, f); }, i); } for (int i = 0; i < 8; ++i) { p[i]->join(); delete p[i]; } std::cout << "size: " << sizeof(f) << std::endl; std::cout << "count: " << f.bits.count << std::endl; } 结果正如预期的那样... 尺寸:2 数量:4

回答 1 投票 0

无符号短和匿名位域的联合

最小示例: 联盟v1_t { 结构体{ 无符号整型 d1 : 4; 无符号整型 d2 : 4; 无符号整数:8; }; 无符号短数据; }; 联盟v2_t { 无符号短数据...

回答 1 投票 0

在基类中保留内存以在派生类c++中使用

我正在编写一些低级抽象,用于通过 SPI 与某些芯片进行通信,并且我创建了寄存器抽象以避免棘手的位操作。我想我可以创建界面

回答 1 投票 0

如何在汇编编程语言中分配位域 - NASM

我可以在内存中分配n个长度的位字段吗? 如果这个答案是肯定的,我可以在这个字段中进行加法和乘法等运算吗?

回答 1 投票 0

为什么我的代码在VS Code环境下无法正确输出'C'信息,但在GCC下却可以正常输出?这可能是由于与位域相关的问题

假 真的 #包括 使用命名空间 std; enum Leve{大一,大二,大三,大四}; 枚举等级{A,B,C,D}; 班级学生{ 民众: 学生(无符号数、Leve 级别、年级):

回答 1 投票 0

24 位和 8 位变量联合的定义行为

我正在尝试找到将 24 位和 8 位无符号整数打包为 32 位的最佳方法,而不需要位移来提取数据。工会立即想到一个简单的方法

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.