【brpc】C++关于private的一则hack
2018-02-28 20:44
633 查看
brpc是百度开源的RPC框架,github:https://github.com/brpc/brpc,初步看了下描述:performance据其官方测试数据(本人未亲测),基本上比其他内外部RPC框架都要优秀,但我个人比较感兴趣的还是对各种protocol的自适应支持,提供灵活扩展接口,这个不错,源码只是大概翻了下,还没细看!
关于pb协议头文件有个hack小技巧,代码如下:// Since kDefaultTotalBytesLimit is private, we need some hacks to get the limit.
// Works for pb 2.4, 2.6, 3.0
#define private public
#include <google/protobuf/io/coded_stream.h>
const int PB_TOTAL_BYETS_LIMITS_RAW =
google::protobuf::io::CodedInputStream::kDefaultTotalBytesLimit;
const uint64_t PB_TOTAL_BYETS_LIMITS =
PB_TOTAL_BYETS_LIMITS_RAW < 0 ? (uint64_t)-1LL : PB_TOTAL_BYETS_LIMITS_RAW;
#undef private为了获取pb最大字节限制,将private hack为public,这样就可以顺利拿到值了。
当然更暴力点的是,直接改成public不就完了吗,虽然值也能拿到,但是相比hack这种trick手法,未免过于暴力,还有最重要的实施起来需要用户在本地pb头文件修改,而且影响全局,用户未必知道并且愿意去做,就会编译报错或拿不到,框架hack是相对比较优雅的方式。
自己写了各小测试代码,gcc 4.8+验证ok,代码如下:
a.h#ifndef _A_H_
#define _A_H_
class A
{
public:
A() : m_a(1) {}
private:
int m_a;
};
#endif // _A_H_main.cpp#include <stdio.h>
#define private public
#include "a.h"
#undef private
int main()
{
A a;
printf("private m_a=%d\n", a.m_a);
return 0;
}输出:
private m_a=1
hack获取类privat成员还有其他方法,诸如计算内存offset等,但这种对于变化的第三方class文件(如果用户修改了pb头文件变量顺序,当然极少有用户这么做),可控性较差,避免所有都编译成功,最后运行不了,出现诡异的bug!
关于pb协议头文件有个hack小技巧,代码如下:// Since kDefaultTotalBytesLimit is private, we need some hacks to get the limit.
// Works for pb 2.4, 2.6, 3.0
#define private public
#include <google/protobuf/io/coded_stream.h>
const int PB_TOTAL_BYETS_LIMITS_RAW =
google::protobuf::io::CodedInputStream::kDefaultTotalBytesLimit;
const uint64_t PB_TOTAL_BYETS_LIMITS =
PB_TOTAL_BYETS_LIMITS_RAW < 0 ? (uint64_t)-1LL : PB_TOTAL_BYETS_LIMITS_RAW;
#undef private为了获取pb最大字节限制,将private hack为public,这样就可以顺利拿到值了。
当然更暴力点的是,直接改成public不就完了吗,虽然值也能拿到,但是相比hack这种trick手法,未免过于暴力,还有最重要的实施起来需要用户在本地pb头文件修改,而且影响全局,用户未必知道并且愿意去做,就会编译报错或拿不到,框架hack是相对比较优雅的方式。
自己写了各小测试代码,gcc 4.8+验证ok,代码如下:
a.h#ifndef _A_H_
#define _A_H_
class A
{
public:
A() : m_a(1) {}
private:
int m_a;
};
#endif // _A_H_main.cpp#include <stdio.h>
#define private public
#include "a.h"
#undef private
int main()
{
A a;
printf("private m_a=%d\n", a.m_a);
return 0;
}输出:
private m_a=1
hack获取类privat成员还有其他方法,诸如计算内存offset等,但这种对于变化的第三方class文件(如果用户修改了pb头文件变量顺序,当然极少有用户这么做),可控性较差,避免所有都编译成功,最后运行不了,出现诡异的bug!
相关文章推荐
- C++中关于public、protect、private的访问权限控制
- C++中关于public、protect、private的访问权限控制
- 关于C++的private继承问题
- C++学习点滴--关于private作用域问题
- C++:关于什么对象要放到class的public范围中,什么对象放到class的private范围中
- 关于C++中的public、private、protected
- 关于c++中的public继承,private继承,以及protect继承的问题
- 关于C++中的public,protected, private
- 关于C++中的模板
- 关于Platinum库的MediaRender具体C++代码实现探讨
- C++中public,protected,private访问小结
- 关于C/C++/Java的比喻
- 关于c++字符串的一个问题
- C++ - 关于类的成员函数的问题
- 关于C++泛型编程的一些杂感
- C++中 public protected private 类成员的访问
- C++中,关于#include<***.h>和#include"***.h"的区别
- 关于C++类库KYLib: 使用AVLtree实现 map 类模板源码
- 关于C/C++ 表达式求值顺序
- 关于c++多态