gpt4 book ai didi

节俭一代变量意外改变

转载 作者:行者123 更新时间:2023-12-04 03:38:14 25 4
gpt4 key购买 nike

作为背景,我在 RHEL7 上使用 thrift 版本 0.9.3 生成 C++。最近向现有的 thrift 文件添加了一个新函数。当从 thrift 生成 cpp 文件并将新生成的文件与现有的旧文件进行比较时,我注意到较新的代码更改了部分代码,对我来说,更改没有意义(即没有新的实现,只是变量名称更改为现有代码)。思考过程可能与新功能有关。所以为了说服自己这只是因为新功能,我再次生成文件,没有功能(基本上使用以前的thrift 文件的版本)。同样,更改保持不变。

澄清一下,在现有的 cpp 文件中有一段这样的代码:

 uint32_t _size79;
::apache::thrift::protocol::TType _etype82;
xfer += iprot->readListBegin(_etype82, _size79);
(*(this->success)).resize(_size79);

较新的结果(有或没有新功能)会将变量更改为:

 uint32_t _size86;
::apache::thrift::protocol::TType _etype89;
xfer += iprot->readListBegin(_etype89, _size86);
(*(this->success)).resize(_size86);

现在我知道您不应该试图挑剔节俭产生的结果,但是什么可能导致这种情况发生?我浏览了白皮书和其他一些地方,试图弄清楚为什么会发生这样的随机变化,但没弄明白多少。我希望能够说,“这没关系,因为这个特定的过程,有时这是意料之中的……”。我觉得这些变量应该保持一致,因为它们来自同一个 thrift 文件,同一个 thrift 编译器版本,尽管生成时间相隔几个月。

谢谢。希望我只是错过了一个概念。

最佳答案

uint32_t _size79;

生成代码中的内部变量是由接受前缀并向其添加数字的算法创建的。数字每次都会增加。这就是技术解释。

不过,你不应该关心它。

请注意,以下内容适用于您作为软件开发人员在余生中调用或使用的任何类型的函数或 API。

如何使用纯内部 变量的方式对该例程之外的任何代码片段都没有意义。虽然这不是关于 encapsulation in the OOP sense , 有点可比性。特定函数的调用代码(或由它调用的代码)需要知道的任何信息都在方法签名和任何相关文档中。

I've gone through the white paper, and a few other places to try and figure out why random changes like this would happen, but couldn't figure out much.

换句话说,这是未记录的行为。通常不记录内部实现细节的原因是为了防止任何人依赖它,并可能在它的基础上进行构建。关于封装的整个想法是有意隐藏这样的细节。这允许随时更改实现,而不会影响或破坏它之外的任何代码。

这也是为什么依赖未记录的东西是一把双刃剑的原因:它允许更大的灵 active ,但这种力量是以冒与 future 版本兼容的风险为代价的,甚至是次要的修补程序更新。

Part of me feels like these variables should have stayed consistent given that they came from the same thrift file, same thrift compiler version, though generated a few months apart.

产生这种感觉的原因是假设您必须知道(并关心)内部发生的事情。这个假设是不正确的。假装这个方法是一个黑盒子:你甚至不会注意到变量名已经改变了。这会改变调用或使用它的代码吗?

关于节俭一代变量意外改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66538884/

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