我在IntelliJ中设置了lombok插件,我的代码构建正常.我可以在结构视图中看到lombok生成的方法.我想要的是实际看到源lombok为每个方法生成的一些方法.我意识到我可以删除文件,但我想知道是否有某种方法我可以翻转一个开关来显示或隐藏lombok生成的代码.
我正在尝试了解Android中的图形内存使用/流,特别是关于使用编码来自相机的帧的方面MediaCodec。为了做到这一点,我必须了解许多我不清楚的图形,OpenGL和Android术语/概念。我已经阅读了Android图形体系结构材料,一系列SO问题和大量资源,但我仍然感到困惑,主要是因为在不同的上下文中术语似乎具有不同的含义。
我已经从fadden的站点这里查看了CameraToMpegTest 。我的具体问题是如何MediaCodec::createInputSurface()与结合使用Camera::setPreviewTexture()。似乎先创建了OpenGL纹理,然后将其用于创建一个Android SurfaceTexture,然后可以将其传递给setPreviewTexture()。我的具体问题:
setPreviewTexture()帧从相机转到哪个内存缓冲区,调用实际上会做什么?SurfaceTexture提到它允许您“将图像流式传输到给定的OpenGL纹理”:https : //developer.android.com/reference/android/graphics/SurfaceTexture.html#SurfaceTexture(int)。SurfaceTexture在OpenGL纹理之上做什么?MediaCodec::createInputSurface()返回一个Android Surface。据我了解,Android Surface代表缓冲区队列的生产方,因此它可能是多个缓冲区。该API参考提到,“表面必须用硬件加速API来呈现,如OpenGL ES”。如何帧从相机获取捕捉SurfaceTexture到这Surface是输入到编码器?我看到CameraToMpegTest的创建EGLSurface使用这种Surface莫名其妙但不知道很多关于EGL我没有得到这个部分。编辑:mstorsjo的答复的后续行动:
SurfaceTexture并CameraClient::setPreviewTarget() 在CameraService一些尝试和了解的内部运作Camera::setPreviewTexture()更好,有更多的问题。对于我最初理解内存分配的问题,似乎要SurfaceTexture创建一个BufferQueue并将其CameraService传递IGraphicBufferProducer给平台摄像机HAL实现。然后,摄像机HAL可以适当地设置gralloc使用标志(例如GRALLOC_USAGE_SW_READ_RARELY | GRALLOC_USAGE_SW_WRITE_NEVER | GRALLOC_USAGE_HW_TEXTURE),还可以从中退出缓冲区BufferQueue。因此,摄像机捕获帧的缓冲区是由gralloc分配的缓冲区,这些缓冲区带有一些特殊的使用标志,例如GRALLOC_USAGE_HW_TEXTURE。我在具有统一内存架构的ARM平台上工作,因此GPU和CPU可以访问相同的内存,因此,这会对您产生什么样的影响?GRALLOC_USAGE_HW_TEXTURE 标志有关于如何分配缓冲区的?SurfaceTexture似乎主要是作为的一部分实现的GLConsumer,而魔术似乎在中 …如果我调用的POSIX函数read()不是C ++标准库的一部分,则我不得不担心它会被信号中断并处理EINTR返回值。如果我fread()根据本文档的说明调用C ++标准库函数,则没有提及,EINTR因此标准库似乎向用户隐藏了此函数。我的理解正确吗,这对所有C ++标准库函数都适用吗?
更新:所以从响应中仍然不清楚的是,得出的结论是不能编写在每个平台上都能正常运行的标准C ++?我看到有人提到POSIX行为不是标准的一部分,所以这很令人困惑。
我试图了解静态初始化顺序失败何时是一个真正的问题。如果我使用如下所示的字符串常量,kName它会遇到静态初始化顺序失败的问题吗?Derived在这种情况下这是一个问题吗,因为可以在kName初始化之前创建的实例,如 中 所示main.cpp?
// Base.cpp
namespace test {
class Base {
public:
virtual ~Base() = default;
protected:
explicit Base(const std::string &name);
};
} // namespace test
// Derived.cpp
namespace test {
static const std::string kName = "my name";
class Derived : public Base {
public:
Derived() : Base(kName) {}
~Derived() override = default;
};
} // namespace test
// main.cpp
int main() {
test::Derived instance{};
return 0;
}
Run Code Online (Sandbox Code Playgroud) std::unique_ptr由于复制省略,我能够将右值作为参数传递给如下所示的函数。副本是否一定会被C ++ 11标准淘汰,或者在某些实现中无法编译?
void take_unique_ptr_by_value(std::unique_ptr<int> sp) {
cout << "Value is " << *sp.get() << std::endl;
}
// I am able to call the function above like this:
take_unique_ptr_by_value(std::make_unique<int>(3));
Run Code Online (Sandbox Code Playgroud) 如果我在构造函数中创建一个线程,并且该线程访问该对象,是否需要在该线程访问该对象之前引入释放屏障?具体来说,如果我有下面的代码(wandbox链接),是否需要将互斥锁锁定在构造函数中(注释行)?我需要确保worker_thread_看到写入,run_worker_thread_因此不会立即退出。我意识到在这里使用原子布尔值更好,但是我对这里的内存顺序含义感兴趣。根据我的理解,我认为我确实需要在构造函数中锁定互斥锁,以确保构造函数中的互斥锁的解锁所提供的释放操作与threadLoop()通过调用互斥锁来实现的获取操作同步。shouldRun()。
class ThreadLooper {
public:
ThreadLooper(std::string thread_name)
: thread_name_{std::move(thread_name)}, loop_counter_{0} {
//std::lock_guard<std::mutex> lock(mutex_);
run_worker_thread_ = true;
worker_thread_ = std::thread([this]() { threadLoop(); });
// mutex unlock provides release semantics
}
~ThreadLooper() {
{
std::lock_guard<std::mutex> lock(mutex_);
run_worker_thread_ = false;
}
if (worker_thread_.joinable()) {
worker_thread_.join();
}
cout << thread_name_ << ": destroyed and counter is " << loop_counter_
<< std::endl;
}
private:
bool shouldRun() {
std::lock_guard<std::mutex> lock(mutex_);
return run_worker_thread_;
}
void threadLoop() { …Run Code Online (Sandbox Code Playgroud) 我已经完成了大量有关动态链接器重定位和位置无关代码的阅读,包括过程链接表和全局偏移表。我不明白为什么静态链接的可执行文件需要PLT和GOT。我在ubuntu x86_64机器上编译了一个hello world程序,当我转储节标题时,readelf -S它显示了PLT和GOT节。
我还创建了一个共享库,它带有一个简单的增量函数,gcc -shared不带该函数即可进行编译,-fpic并且还可以看到PLT和GOT部分。我也没想到这一点。
我正在解析一个文件,该文件具有多个时间序列的时间序列时间戳数据,我想在 python 中解析这些数据,然后使用 matplotlib 为每组时间序列数据创建一个带有独立线的单线图。我正在解析的数据如下所示:
time label value
1.05 seriesA 3.925
1.09 seriesC 0.245
2.13 seriesB 12.32
2.73 seriesC 4.921
Run Code Online (Sandbox Code Playgroud)
我已将该文件解析为包含在系列标签上键入的 (time,value) 元组的列表字典。我正在努力解决如何从所有这些数据获得单线图。我希望在单个绘图上为系列 A、系列 B、系列 C 等提供独立的线条。任何指针?
编辑:根据要求,字典如下。我很难找出存储这些数据的最佳方式,所以也许我使用的数据结构也是一个问题。下面的键是不同的时间序列标签,值是 (time,value) 元组的列表。无论如何,这里是:
{'client1': [(861.991698574, 298189000.0), (862.000768158, 0.0)],
'client2': [(861.781502324, 0.0), (861.78903722, 153600000.0),
(862.281483262, 0.0), (862.289038158, 153600000.0)], 'client3':
[(862.004470762, 3295674368.0), (862.004563939, 3295674368.0),
(862.03981821, 799014912.0), (862.040403314, 1599078400.0),
(862.540269616, 3295674368.0), (862.55133097, 1599078400.0)]}
Run Code Online (Sandbox Code Playgroud) 我正在尝试理解“Effective Modern C++”中有关特殊成员函数生成的第 17 条,因此我尝试了一些示例并尝试推理某些行为。书中写道:
\n\n\n\n\n..当我提到移动操作移动构造或移动分配数据成员或基类时,不能保证移动实际上会发生。\xe2\x80\x9c成员移动\xe2\x80\x9d 实际上更像是成员移动请求,因为\xe2\x80\x99t 移动启用的类型(即不为移动操作提供特殊支持,例如,大多数 C++98 遗留类)将通过其复制操作\xe2\x80\x9cmoved\xe2\x80\x9d。\n ...\n 此外,不会为任何生成\xe2\x80\x99d 移动操作显式声明复制操作的类。
\n
如果我显式删除移动构造函数,则下面的代码会出错,但如果我不这样做,则对象“s1”将被复制构造而不会出现任何错误。这是指向相同代码的 wandbox 链接:wandbox link。我想我不明白删除移动构造函数和不定义移动构造函数之间的区别。
\n\n#include <iostream>\n\nstruct S\n{\n S() = default;\n S(const S&) {\n std::cout << "Copying" << std::endl;\n }\n // S(S&&) = delete;\n};\n\nS return_lvalue() {\n S ret{};\n return ret;\n}\n\nint main() {\n std::cout << "Hello world" << std::endl;\n // Error here if I delete move constructor\n S s1 = return_lvalue();\n}\nRun Code Online (Sandbox Code Playgroud)\n 我有一个关于3.10内核中printk()实现的问题.我把它称之为 local_irq_save开头.我看到它然后打电话 raw_spin_lock(&logbuf_lock).如果在此之前已经禁用了中断,那么logbuf_lock的目的是什么?是因为即使在当前CPU上禁用了中断,其他CPU仍然可以调用printk,因此需要停止写入日志缓冲区吗?
基本上我有三个问题:
我看到printk获取了logbuf_lock并写入日志缓冲区,然后尝试获取控制台信号量并释放logbuf_lock.然后在console_unlock循环内部获取logbuf_lock并禁用中断,然后释放logbuf_lock并调用控制台驱动程序,然后恢复中断.这种锁定/禁用中断序列的目的是什么?
我在printk()中看到有关日志缓冲区可能再次填满的注释,因此缓冲区可能必须再次刷新到控制台.考虑到我在上面#1中提到的所有锁定,这种情况会怎样?
如果在任何给定时刻只有1个CPU上的代码要调用printk(),那么中断是否仍然可以在SMP系统中的其他内核上处理?我也试图了解printk对中断延迟的影响.
谢谢.
一些后续行动:
你能澄清一下吗:
local_irq_save()防止本地CPU上的中断(并且还避免在使用cpu变量访问每个CPU数据时在另一个CPU上重新调度)
你的意思local_irq_save()是,只有在访问每个CPU数据时,调用才会阻止当前线程在另一个CPU上重新调度,或者它是否阻止当前线程在另一个CPU周期重新调度?在这里printk()的情况下local_irq_save()的目的是什么?我记得在LMKL上读过一个线程,说明中断的禁用是为了确保日志缓冲区中的条目顺序反映了printk()调用发生的实际顺序.
在具有 V 个顶点和 E 个边的无向图中,如何计算 O(|V||E|) 中三角形的数量?我在这里看到了该算法,但我不太确定如何实现该算法来实现这种复杂性。这是该帖子中提供的代码:
for each edge (u, v):
for each vertex w:
if (v, w) is an edge and (w, u) is an edge:
return true
return false
Run Code Online (Sandbox Code Playgroud)
您是否会使用图的邻接列表表示来遍历外循环中的所有边,然后使用邻接矩阵来检查内循环中是否存在 2 条边?
另外,我看到另一个解决方案为 O(|V||E|),它涉及在图上执行深度优先搜索,当您遇到来自您正在访问的顶点 u 的后边 (u,v) 时,检查是否顶点 u 的祖父母是顶点 v。如果是,那么您就找到了一个三角形。这个算法正确吗?如果是这样,这不是 O(|V|+|E|) 吗?在我链接的帖子中,提供了广度优先搜索解决方案的反例,但根据我提出的示例,我上面概述的深度优先搜索方法似乎有效。
如果我有一个抽象基类,并且想使所有派生类不可复制且不可移动,那么声明在基类中删除的这些特殊成员函数就足够了吗?我想确保我的整个类层次结构是不可复制和不可移动的,并且想知道是否可以不必在每个派生类中声明这4个特殊成员函数都已删除。我看到一个SO答案,似乎暗示着派生类尽管已从基类中删除了,但仍可以显式声明副本或移动构造函数,但以下示例在尝试定义默认的副本赋值运算符时导致编译错误,因此我不确定。这是错误:
named_class.cc:15:15:错误:默认情况下,此副本构造函数将在其第一个声明DerivedClass :: DerivedClass(const DerivedClass&)= default之后将其删除;
named_class.h:9:22:注意:“ DerivedClass”的副本构造函数被隐式删除,因为基类“ virtual_functions :: BaseClass”具有已删除的副本构造函数类DerivedClass:public BaseClass {
base_class.h:11:3:注意:“ BaseClass”已明确标记为已删除,此处BaseClass(const BaseClass&)= delete;
// base_class.h
class BaseClass {
public:
BaseClass(const BaseClass &) = delete;
BaseClass(BaseClass &&) = delete;
BaseClass &operator=(const BaseClass &) = delete;
BaseClass &operator=(BaseClass &&) = delete;
virtual ~BaseClass() = default;
virtual bool doSomething() = 0;
protected:
BaseClass(std::string name);
private:
std::string name_;
};
// derived_class.h
class DerivedClass : public BaseClass {
public:
DerivedClass();
DerivedClass(const DerivedClass &);
bool doSomething() override;
};
// derived_class.cc
DerivedClass::DerivedClass(const DerivedClass …Run Code Online (Sandbox Code Playgroud) 在Java语言规范说:
每个编译单元都隐式导入预定义包java.lang中声明的每个公共类型名称,就像声明import java.lang。*;一样。在任何package语句之后立即出现在每个编译单元的开头。结果,所有这些类型的名称在每个编译单元中都可以作为简单名称使用。
不时,但是,我看到代码,从进口类java.lang等import java.lang.NullPointerException;。是否有充分的理由这样做?