相关疑难解决方法(0)

C/C++:强制位域顺序和对齐

我读到结构中位字段的顺序是特定于平台的.如果我使用不同的特定于编译器的打包选项,这将保证数据在写入时以正确的顺序存储吗?例如:

struct Message
{
  unsigned int version : 3;
  unsigned int type : 1;
  unsigned int id : 5;
  unsigned int data : 6;
} __attribute__ ((__packed__));
Run Code Online (Sandbox Code Playgroud)

在具有GCC编译器的英特尔处理器上,字段在显示时显示在内存中.Message.version是缓冲区中的前3位,然后Message.type是.如果我找到各种编译器的等效结构包装选项,这将是跨平台的吗?

c c++ bit-manipulation endianness bit

81
推荐指数
5
解决办法
7万
查看次数

在现代x86硬件上编写比特流的最快方法

在x86/x86-64上写入比特流的最快方法是什么?(代码字<= 32位)

通过写一个比特流,我指的是将可变比特长度符号连接成一个连续的内存缓冲区的过程.

目前我有一个带有32位中间缓冲区的标准容器可以写入

void write_bits(SomeContainer<unsigned int>& dst,unsigned int& buffer, unsigned int& bits_left_in_buffer,int codeword, short bits_to_write){
    if(bits_to_write < bits_left_in_buffer){
        buffer|= codeword << (32-bits_left_in_buffer);
        bits_left_in_buffer -= bits_to_write;

    }else{
        unsigned int full_bits = bits_to_write - bits_left_in_buffer;
        unsigned int towrite = buffer|(codeword<<(32-bits_left_in_buffer));
        buffer= full_bits ? (codeword >> bits_left_in_buffer) : 0;
        dst.push_back(towrite);
        bits_left_in_buffer = 32-full_bits;
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有人知道任何好的优化,快速指令或其他可能有用的信息?

干杯,

c++ optimization x86 bit-manipulation

11
推荐指数
2
解决办法
4593
查看次数

"memcpy"式功能,支持各个位的偏移量?

我正在考虑解决这个问题,但它看起来是一项相当艰巨的任务.如果我自己拿这个,我可能会用几种不同的方式写出并选择最好的,所以我想我会问这个问题,看看是否有一个很好的图书馆可以解决这个问题,或者是否有人有想法/建议.

void OffsetMemCpy(u8* pDest, u8* pSrc, u8 srcBitOffset, size size)
{
    // Or something along these lines. srcBitOffset is 0-7, so the pSrc buffer 
    // needs to be up to one byte longer than it would need to be in memcpy.
    // Maybe explicitly providing the end of the buffer is best.
    // Also note that pSrc has NO alignment assumptions at all.
}
Run Code Online (Sandbox Code Playgroud)

我的应用程序是时间关键的,所以我想以最小的开销来确定这一点.这是困难/复杂性的根源.在我的情况下,块可能非常小,可能是4-12个字节,因此大规模的memcpy东西(例如预取)并不重要.对于随机未对齐的src缓冲区,最好的结果是对于常量'大小'输入最快的长度,在4到12之间.

  • 应尽可能将内存移动到字大小的块中
  • 这些字大小的块的对齐很重要.pSrc是未对齐的,因此我们可能需要从前面读取几个字节,直到它对齐为止.

任何人拥有或知道类似实施的东西?或者有人想要写这篇文章,让它尽可能干净和高效吗?

编辑:似乎人们对"过于宽泛"的投票表示"接近".一些缩小的细节将是AMD64的首选架构,所以我们假设.这意味着小端等等.实现有望完全符合答案的大小,所以我不认为这太宽泛了.即使有一些方法,我也会一次要求单个实现的答案.

c c++ optimization bit-manipulation memcpy

4
推荐指数
1
解决办法
687
查看次数

标签 统计

bit-manipulation ×3

c++ ×3

c ×2

optimization ×2

bit ×1

endianness ×1

memcpy ×1

x86 ×1