小编Mik*_*ney的帖子

在IntelliJ IDEA中查看lombok生成的代码

我在IntelliJ中设置了lombok插件,我的代码构建正常.我可以在结构视图中看到lombok生成的方法.我想要的是实际看到源lombok为每个方法生成的一些方法.我意识到我可以删除文件,但我想知道是否有某种方法我可以翻转一个开关来显示或隐藏lombok生成的代码.

intellij-idea lombok intellij-lombok-plugin

32
推荐指数
3
解决办法
2万
查看次数

了解Android相机SurfaceTexture和MediaCodec Surface的用法

我正在尝试了解Android中的图形内存使用/流,特别是关于使用编码来自相机的帧的方面MediaCodec。为了做到这一点,我必须了解许多我不清楚的图形,OpenGL和Android术语/概念。我已经阅读了Android图形体系结构材料,一系列SO问题和大量资源,但我仍然感到困惑,主要是因为在不同的上下文中术语似乎具有不同的含义。

我已经从fadden的站点这里查看了CameraToMpegTest 。我的具体问题是如何MediaCodec::createInputSurface()与结合使用Camera::setPreviewTexture()。似乎先创建了OpenGL纹理,然后将其用于创建一个Android SurfaceTexture,然后可以将其传递给setPreviewTexture()。我的具体问题:

  1. 关于setPreviewTexture()帧从相机转到哪个内存缓冲区,调用实际上会做什么?
  2. 根据我的理解,OpenGL纹理是GPU可以访问的大量内存。在Android上,必须使用带有正确用法标记的gralloc进行分配。Android的说明中SurfaceTexture提到它允许您“将图像流式传输到给定的OpenGL纹理”:https : //developer.android.com/reference/android/graphics/Sur​​faceTexture.html#SurfaceTexture(int)SurfaceTexture在OpenGL纹理之上做什么?
  3. MediaCodec::createInputSurface()返回一个Android Surface。据我了解,Android Surface代表缓冲区队列的生产方,因此它可能是多个缓冲区。该API参考提到,“表面必须用硬件加速API来呈现,如OpenGL ES”。如何帧从相机获取捕捉SurfaceTexture到这Surface是输入到编码器?我看到CameraToMpegTest的创建EGLSurface使用这种Surface莫名其妙但不知道很多关于EGL我没有得到这个部分。
  4. 有人可以澄清“渲染”的用法吗?我看到诸如“渲染到表面”,“渲染到屏幕”之类的东西似乎可能意味着不同的含义。

编辑:mstorsjo的答复的后续行动:

  1. 我挖成的代码,SurfaceTextureCameraClient::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 标志有关于如何分配缓冲区的?
  2. 的OpenGL(ES)部分SurfaceTexture似乎主要是作为的一部分实现的GLConsumer,而魔术似乎在中 …

android opengl-es android-camera egl mediacodec

8
推荐指数
1
解决办法
2288
查看次数

C ++标准I / O和信号

如果我调用的POSIX函数read()不是C ++标准库的一部分,则我不得不担心它会被信号中断并处理EINTR返回值。如果我fread()根据本文档的说明调用C ++标准库函数,则没有提及,EINTR因此标准库似乎向用户隐藏了此函数。我的理解正确吗,这对所有C ++标准库函数都适用吗?

更新:所以从响应中仍然不清楚的是,得出的结论是不能编写在每个平台上都能正常运行的标准C ++?我看到有人提到POSIX行为不是标准的一部分,所以这很令人困惑。

c++ posix

6
推荐指数
1
解决办法
270
查看次数

C++ 字符串常量和静态初始化顺序惨败

我试图了解静态初始化顺序失败何时是一个真正的问题。如果我使用如下所示的字符串常量,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)

c++ static-initialization c++11

5
推荐指数
1
解决办法
520
查看次数

C ++:在传递std :: unique_ptr(仅移动类型)右值作为参数时复制省略号

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)

c++ c++11

4
推荐指数
1
解决办法
131
查看次数

C ++:释放在构造函数中所需的屏障,该构造函数创建访问构造对象的线程

如果我在构造函数中创建一个线程,并且该线程访问该对象,是否需要在该线程访问该对象之前引入释放屏障?具体来说,如果我有下面的代码(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)

c++ multithreading memory-barriers c++11

4
推荐指数
1
解决办法
97
查看次数

为什么在静态链接的可执行文件中有全局偏移表和过程链接表?

我已经完成了大量有关动态链接器重定位和位置无关代码的阅读,包括过程链接表和全局偏移表。我不明白为什么静态链接的可执行文件需要PLT和GOT。我在ubuntu x86_64机器上编译了一个hello world程序,当我转储节标题时,readelf -S它显示了PLT和GOT节。

我还创建了一个共享库,它带有一个简单的增量函数,gcc -shared不带该函数即可进行编译,-fpic并且还可以看到PLT和GOT部分。我也没想到这一点。

linux linker gcc

3
推荐指数
1
解决办法
427
查看次数

Python 线在同一图上绘制多个时间序列

我正在解析一个文件,该文件具有多个时间序列的时间序列时间戳数据,我想在 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)

python matplotlib

3
推荐指数
1
解决办法
8952
查看次数

删除移动构造函数并从右值构造对象

我正在尝试理解“Effective Modern C++”中有关特殊成员函数生成的第 17 条,因此我尝试了一些示例并尝试推理某些行为。书中写道:

\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
\n\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}\n
Run Code Online (Sandbox Code Playgroud)\n

c++ move move-semantics c++11

3
推荐指数
1
解决办法
558
查看次数

printk中断禁用和锁定

我有一个关于3.10内核中printk()实现的问题.我把它称之为 local_irq_save开头.我看到它然后打电话 raw_spin_lock(&logbuf_lock).如果在此之前已经禁用了中断,那么logbuf_lock的目的是什么?是因为即使在当前CPU上禁用了中断,其他CPU仍然可以调用printk,因此需要停止写入日志缓冲区吗?

基本上我有三个问题:

  1. 我看到printk获取了logbuf_lock并写入日志缓冲区,然后尝试获取控制台信号量并释放logbuf_lock.然后在console_unlock循环内部获取logbuf_lock并禁用中断,然后释放logbuf_lock并调用控制台驱动程序,然后恢复中断.这种锁定/禁用中断序列的目的是什么?

  2. 我在printk()中看到有关日志缓冲区可能再次填满的注释,因此缓冲区可能必须再次刷新到控制台.考虑到我在上面#1中提到的所有锁定,这种情况会怎样?

  3. 如果在任何给定时刻只有1个CPU上的代码要调用printk(),那么中断是否仍然可以在SMP系统中的其他内核上处理?我也试图了解printk对中断延迟的影响.

谢谢.

一些后续行动:

你能澄清一下吗:

local_irq_save()防止本地CPU上的中断(并且还避免在使用cpu变量访问每个CPU数据时在另一个CPU上重新调度)

你的意思local_irq_save()是,只有在访问每个CPU数据时,调用才会阻止当前线程在另一个CPU上重新调度,或者它是否阻止当前线程在另一个CPU周期重新调度?在这里printk()的情况下local_irq_save()的目的是什么?我记得在LMKL上读过一个线程,说明中断的禁用是为了确保日志缓冲区中的条目顺序反映了printk()调用发生的实际顺序.

linux scheduler linux-kernel

2
推荐指数
1
解决办法
2878
查看次数

计算图中的三角形(长度为 3 的周期)

在具有 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|) 吗?在我链接的帖子中,提供了广度优先搜索解决方案的反例,但根据我提出的示例,我上面概述的深度优先搜索方法似乎有效。

algorithm graph data-structures

2
推荐指数
1
解决办法
5385
查看次数

在基类中删除复制和移动构造函数/赋值运算符是否足够?

如果我有一个抽象基类,并且想使所有派生类不可复制且不可移动,那么声明在基类中删除的这些特殊成员函数就足够了吗?我想确保我的整个类层次结构是不可复制和不可移动的,并且想知道是否可以不必在每个派生类中声明这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)

c++ deleted-functions c++11

2
推荐指数
2
解决办法
395
查看次数

为什么要导入像NullPointerException这样的java.lang类?

Java语言规范说:

每个编译单元都隐式导入预定义包java.lang中声明的每个公共类型名称,就像声明import java.lang。*;一样。在任何package语句之后立即出现在每个编译单元的开头。结果,所有这些类型的名称在每个编译单元中都可以作为简单名称使用。

不时,但是,我看到代码,从进口类java.langimport java.lang.NullPointerException;。是否有充分的理由这样做?

java

2
推荐指数
1
解决办法
68
查看次数