gpt4 book ai didi

C++ Lua用户数据与Mathfu浮点值混淆

转载 作者:行者123 更新时间:2023-12-02 10:20:47 26 4
gpt4 key购买 nike

我正在尝试使用 Lua 中的 Mathfu::Vector 创建 vector ,但是当我尝试从堆栈中检索用户数据时遇到问题。

这是我用来定义用户数据的函数

static int vec4(lua_State *L)
{
const float x = luaL_checknumber(L, 1);
const float y = luaL_checknumber(L, 2);
const float z = luaL_checknumber(L, 3);
const float w = luaL_checknumber(L, 4);

mathfu::Vector<float, 4> vec(x, y, z, w);
*static_cast<mathfu::Vector<float, 4> **>(
lua_newuserdata(L, sizeof(mathfu::Vector<float, 4> *))) = &vec;
luaL_setmetatable(L, VECTOR_LIB_NAME);

return 1;
}

我有一个函数可以根据 self 获取两个 vector 的点积。值和参数(都是用户数据)

static int dotVector(lua_State *L)
{
mathfu::Vector<float, 4> *vecA = *static_cast<mathfu::Vector<float, 4> **>(luaL_checkudata(L, 1, VECTOR_LIB_NAME));
mathfu::Vector<float, 4> *vecB = *static_cast<mathfu::Vector<float, 4> **>(luaL_checkudata(L, 2, VECTOR_LIB_NAME));

LOGI("A: %f, %f, %f", vecA->x, vecA->y, vecA->z);
LOGI("B: %f, %f, %f", vecB->x, vecB->y, vecB->z);
float dot = mathfu::Vector<float, 4>::DotProduct(*vecA, *vecB);
lua_pushnumber(L, dot);

return 1;
};

从lua调用

local vecA = vec4(1, 2, 3, 4)
local vecB = vec4(5, 6, 7, 8)
vecA:dot(vecB)

但是打印出来的值很疯狂,就像将坏数据转换为浮点数一样
A: -8055257885499399810754615288266752.000000, 0.000000, 0.000000
B: 0.000000, 3746318080.000000, 3573.204346

我检查了堆栈,前两个元素肯定是 UserData,但我似乎无法更深入地挖掘用户数据。 C++ 中的变量包含这些值,但我不知道是什么原因造成的。很确定用户数据不是我期望的那样。

最佳答案

不,您确实发生了内存泄漏。第一个版本是指向堆栈分配对象(&vec)的指针,一旦函数结束,它就会被销毁。
第二个版本(新的 mathfu::Vector)在堆上正确创建......我猜你以后永远不会删除它 = 内存泄漏。

还要尽量避免指针的 static_cast。或任何强制施法。这会增加问题,例如如果 g++ 将使用“严格别名”(由 -O3 隐含),那么任何指针转换都将被破坏。 “严格别名”假设 1 个内存块从未被不同类型的指针指向。或者您应该显式配置编译器以远离它。
一般的好主意是使用memcpy。编译器正确理解和优化它。例如,如果您希望将指针作为 char 指向 int32:

int32 a; 
char b[sizeof(a)];
memcpy(b, &a, sizeof(a));

现在改用 b
static_cast<char*>(&a);

关于C++ Lua用户数据与Mathfu浮点值混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60278177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com