簡體   English   中英

從字節緩沖區取回浮點值?

[英]Get float values back from byte buffer?

我目前正在學習 C++,目前我正在試驗指針和結構。 在下面的代碼中,我將向量 A 復制到大小為 100 字節的緩沖區中。 之后,我將向量 B 復制到具有偏移量的同一緩沖區中,以便向量在緩沖區中彼此相鄰。 之后,我想再次在緩沖區中找到向量並計算向量之間的點積。

#include <iostream>

const short SIZE = 5;

typedef struct vector {
    float vals[SIZE];
} vector;

void vector_copy (vector* v, vector* target) {
    for (int i=0; i<SIZE; i++) {
        target->vals[i] = v->vals[i];
    }
}

float buffered_vector_product (char buffer[]) {
    float scalar_product = 0;
    int offset = SIZE * 4;
    for (int i=0; i<SIZE; i=i+4) {
        scalar_product += buffer[i] * buffer[i+offset];
    }
    return scalar_product;
}

int main() {

    char buffer[100] = {};
    vector A = {{1, 1.5, 2, 2.5, 3}};
    vector B = {{0.5, -1, 1.5, -2, 2.5}};

    vector_copy(&A, (vector*) buffer);
    vector_copy(&B, (vector*) (buffer + sizeof(vector)));

    float prod = buffered_vector_product(buffer);
    std::cout << prod <<std::endl;
    return 0;
}

不幸的是,這還不起作用。 問題在於 function buffered_vector_product 我無法從緩沖區取回浮點值。 每個浮點值應該需要 4 個字節。 我不知道,如何訪問這 4 個字節並將它們轉換為浮點值。 誰能幫我嗎? 非常感謝!

在 function buffered_vector_product中,更改行

int offset = SIZE * 4;
for (int i=0; i<SIZE; i=i+4) {
    scalar_product += buffer[i] * buffer[i+offset];
}

for ( int i=0; i<SIZE; i++ ) {
    scalar_product += ((float*)buffer)[i] * ((float*)buffer)[i+SIZE];
}

如果要手動計算偏移量,可以將其替換為以下內容:

size_t offset = SIZE * sizeof(float);
for ( int i=0; i<SIZE; i++ ) {
    scalar_product += *(float*)(buffer+i*sizeof(float)) * *(float*)(buffer+i*sizeof(float)+offset);
}

但是,對於這兩種解決方案,您都應該注意 alignment 限制和嚴格的別名規則

alignment限制的問題可以通過換行解決

char buffer[100] = {};

到以下:

alignas(float) char buffer[100] = {};

嚴格的別名規則是一個更復雜的問題,因為確切的規則在不同的 C++ 標准之間發生了顯着變化,並且與 C 語言中的嚴格別名規則不同(或至少是不同的)。 有關此問題的更多信息,請參閱評論部分中的鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM