[英]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.