我熟悉OpenGL和OpenGL ES之间的基本区别,例如没有glBegin,glEnd,没有四边形等等.
因此,我的问题不是关于两个API之间的差异,而是关于编写实际可以在API及其各种实现上工作的代码,特别是关于ES,其中实现似乎变化更大.
当然,这意味着符合两个API中存在的功能和相同的语法,没有太多花哨和前沿,OpenGL ES 2是最低的共同点.
我的问题很简单.我有一个类模板,它包含一个指向动态分配类型的指针.我想重载间接运算符,以便引用带有 - >运算符的类模板实例,我被重定向,就像我直接使用包含在其中的指针一样.
template<class T>
class MyClass
{
T *ptr;
...
// created dynamic resource for ptr in the constructor
};
Run Code Online (Sandbox Code Playgroud)
创建某种类型的myclass:
MyClass<SomeObject> instance;
Run Code Online (Sandbox Code Playgroud)
所以我想要的不是必须键入:
instance.ptr->someMemberMethod();
Run Code Online (Sandbox Code Playgroud)
我只需输入:
intance->someMemberMethod();
Run Code Online (Sandbox Code Playgroud)
即使你instance
不是一个指针,它的行为就像指针所instance
包含的一样.如何通过超载运营商来弥补这一差距?
是否可以在std容器上使用typedef而不专门化它?
像这样的代码有效:
typedef std::vector<int> intVector;
Run Code Online (Sandbox Code Playgroud)
但是对于这段代码:
template <typename T>
typedef std::vector<T> DynamicArray<T>;
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
'typedef'的模板声明
可以用C++做到这一点吗?
c++ templates typedef specialization template-specialization
我正在实现一个简单的VM,目前我正在使用运行时算术来计算单个程序对象地址作为基指针的偏移量.
我今天就这个问题提出了几个问题,但我似乎无处可去.
我从第一个问题中学到了一些东西 - 对象和结构成员访问和地址偏移计算 - 我了解到现代处理器具有虚拟寻址功能,允许计算内存偏移,而无需任何额外的周期用于算术.
问题二 - 在C/C++编译期间是否解决了地址偏移? - 我了解到手动进行偏移时无法保证这种情况发生.
到目前为止,我应该清楚的是,我想要实现的是利用硬件的虚拟内存寻址功能并从运行时卸载它们.
我正在使用GCC,就像平台一样 - 我在Windows上开发x86,但由于它是一个VM,我希望它能够在GCC支持的所有平台上高效运行.
因此欢迎任何有关该主题的信息,我们将非常感谢.
提前致谢!
编辑:关于我的程序代码生成的一些概述 - 在设计阶段,程序被构建为树层次结构,然后递归地序列化为一个连续的内存块,以及索引对象并计算它们从程序内存块的开头的偏移量.
编辑2:这是VM的一些伪代码:
switch *instruction
case 1: call_fn1(*(instruction+1)); instruction += (1+sizeof(parameter1)); break;
case 2: call_fn2(*(instruction+1), *(instruction+1+sizeof(parameter1));
instruction += (1+sizeof(parameter1)+sizeof(parameter2); break;
case 3: instruction += *(instruction+1); break;
Run Code Online (Sandbox Code Playgroud)
情况1是一个函数,它接受一个参数,该参数在指令之后立即找到,因此它作为指令的1个字节的偏移量传递.指令指针递增1 +第一个参数的大小以找到下一个指令.
情况2是一个函数,它接受两个参数,与之前相同,第一个参数作为1个字节的偏移量传递,第二个参数作为1个字节的偏移量加上第一个参数的大小.然后,指令指针增加指令的大小加上两个参数的大小.
情况3是goto语句,指令指针递增一个紧跟goto指令的偏移量.
编辑3:根据我的理解,操作系统将为每个进程提供自己专用的虚拟内存寻址空间.如果是这样,这是否意味着第一个地址总是......好零,所以从内存块的第一个字节开始的偏移实际上就是这个元素的地址?如果内存地址专用于每个进程,并且我知道程序存储器块的偏移量和每个程序对象与内存块的第一个字节的偏移量,那么在编译期间是否解析了对象地址?
问题是在编译C代码期间这些偏移是不可用的,它们在"编译"阶段和字节代码转换期间就已知.这是否意味着没有办法为"免费"进行对象内存地址计算?
例如,如何在Java中完成此操作,其中只将虚拟机编译为机器代码,这是否意味着由于运行时算术,对象地址的计算会降低性能?
假设我们有一个包含不同元素的绘图程序,例如圆形,矩形,三角形等.不同种类的对象都需要类似的功能,比如draw()
展示自己.
我想知道程序员如何处理现在通常通过多态解决的问题,即通过一组不相同的元素并调用不同对象的通用功能.
想到的一种方法是使用一个带有函数指针的结构,该函数指针指向适当的函数(或函数指针数组中的索引)以及指向实际实例的void指针,并将指针转换为正确的类型在功能中.但这就是我 - 一个对这个问题毫无头绪的人会这样做.
我确实意识到这可能是一个愚蠢的问题,但由于我在"过去"的日子里没有出现过,我真的很想知道这个问题是如何解决的.在程序编程中使用了什么样的方法并且它具有性能优势,因为我们都知道多态性即使在像C++这样的快速语言中也有开销,这是由于虚方法查找.
我很好奇QObject究竟有多大,包括每个实例动态创建的典型私有数据.sizeof
由于它们的实施方式,我无法得到那些.
编辑:请注意,我问的QObject的典型使用场景的大小,我不是问"如何获得大小"这是其他问题的关键,我问的是谁知道大概的大小,因为很明显,语言本身并没有提供报告的方法.
我已经基于底层QHash创建了一个QAbstractListModel派生模型.由于我需要在QML中使用该模型,我无法利用Qt小部件和视图集成的排序功能.
我尝试使用QSortFilterProxyModel但它似乎不适用于我的模型.让模型在QML中正常工作并不够乏味,现在我仍然坚持排序.
任何建议表示赞赏.
这是模型来源:
typedef QHash<QString, uint> Data;
class NewModel : public QAbstractListModel {
Q_OBJECT
Q_PROPERTY(int count READ count NOTIFY countChanged)
public:
NewModel(QObject * parent = 0) : QAbstractListModel(parent) {}
enum Roles {WordRole = Qt::UserRole, CountRole};
QHash<int, QByteArray> roleNames() const {
QHash<int, QByteArray> roles;
roles[WordRole] = "word";
roles[CountRole] = "count";
return roles;
}
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const {
if (index.row() < 0 || index.row() >= m_data.size()) return QVariant();
Data::const_iterator iter = m_data.constBegin() + index.row();
switch …
Run Code Online (Sandbox Code Playgroud) 即使在 Qt 应用程序中,是否也可以接收鼠标单击,对其进行评估,并在必要时让它落入 Qt 应用程序窗口下方可能发生的任何内容?
请注意,这Qt::WA_TransparentForMouseEvents
并不利于在传递点击之前对其进行评估。
而且由于点击评估包含了一些动态逻辑,因此也不适用于设置静态遮罩,除此之外还会产生视觉影响。
理想情况下,我想要一种有选择地允许鼠标单击以平台可移植方式穿过应用程序窗口的方法,最好是从 QML 进行,而不需要引入小部件模块,或者至少不涉及深入研究私有 C++ 内部 API 。
随着谷歌贬低GCC,Android的Qt 5.12转向远离它,转而支持Clang.这使现有的建筑指南过时,因为它们都是基于海湾合作委员会的.
Android的Qt版本缺乏一些重要功能,而且相关文档似乎已经过时了.
此外,5.12推出了一个关键的Android相关错误,它几乎要求定制构建暂时合并修复.
我自己以前从未使用过Clang,而且我是那些真正喜欢只是创建应用程序的人之一,而不是经历尝试构建必需工具时经常令人难以忍受的令人沮丧的经历.
Qt on Clang将继续存在,并且5.12是一个长期支持版本,我认为详细的一步一步指导如何生成有效的Qt构建将对许多人有益.这绝对可以节省我头痛和挫折的日子,因此我愿意为第一个可重复的答案提供慷慨的赏金,以及促进问题可见性可能需要的任何奖励.
我的个人要求是SSL,MySQL和PostgreSQL支持,但欢迎使用其他功能.看起来基于Linux的指南将是最有益的格式,因为它也适用于通过MSYS的Windows.
c++ ×5
qt ×4
qml ×2
addressing ×1
android ×1
c ×1
indirection ×1
jit ×1
machine-code ×1
mouseevent ×1
native ×1
offset ×1
oop ×1
opengl ×1
opengl-es ×1
performance ×1
polymorphism ×1
qobject ×1
size ×1
sorting ×1
sql ×1
ssl ×1
templates ×1
typedef ×1