小编YeP*_*IcK的帖子

C/C++:强制位域顺序和对齐

我读到结构中位字段的顺序是特定于平台的.如果我使用不同的特定于编译器的打包选项,这将保证数据在写入时以正确的顺序存储吗?例如:

struct Message
{
  unsigned int version : 3;
  unsigned int type : 1;
  unsigned int id : 5;
  unsigned int data : 6;
} __attribute__ ((__packed__));
Run Code Online (Sandbox Code Playgroud)

在具有GCC编译器的英特尔处理器上,字段在显示时显示在内存中.Message.version是缓冲区中的前3位,然后Message.type是.如果我找到各种编译器的等效结构包装选项,这将是跨平台的吗?

c c++ bit-manipulation endianness bit

81
推荐指数
5
解决办法
7万
查看次数

轻量级C++图像库

我一直在寻找一个简单而小巧但又快速(全面!)的C++图像库(如果没有C++版本,C就足够了).

我正在寻找的主要功能是:

  • 免费(开源是一个加号)
  • 专为速度而设计
  • 没有巨大的功能膨胀(比如ImageMagik,这是真正全面的但是是猛犸象)
  • 微小的内存占用
  • 仅支持绝对最小的功能,如加载/保存,调整大小,格式之间的转换.没有什么花哨
  • "损坏"文件的错误恢复(不像stb_image.c,错误恢复非常差)
  • MSVC和gcc友好(我使用CxImage了很多年但是最新版本我遇到了MSVC 2010的问题,看起来它的积极开发和支持已经消失了,所以我即将放弃它)
  • 应该支持流行的现代格式,如JPEG2000,直接或通过使用通用库 libpng
  • 不关心它是DirectX还是OpenGL,因为我不打算用它来显示图像 - 只是为了网站的文件处理
  • 支持静态和动态链接是一个优点
  • 线程支持是一个巨大的优势

由于某种原因我查看和解雇的图书馆:

  • CxImage(不再有活跃的开发)
  • ImageMagik - 太大(和慢)
  • stb_image.c - 错误处理错误,不支持足够的图像格式
  • 恶魔(还没有被解雇,但也没有看过很多 - 只是在几分钟之前在类似的帖子上了解到它) - 根据它的大小和功能设置它看起来非常有希望我需要的东西
  • FreeImage(和DevIL一样 - 很快就会看一下它,但它的尺寸有点大我的口味)
  • SOIL(与stb_image.c相同)
  • TimThumb - 它是一个PHP,而不是一个C/C++

简而言之,我只想要尽可能小的东西,尽可能快地以牺牲绝对最小的功能为代价,但到目前为止我还没找到合适的候选者.

请问这个社区有什么建议吗?但请记住我上面列出的限制 - 我不认为抛出表格的答案"你试过X吗?" "X"不符合我需要的一半:)

编辑:进一步了解DevIL似乎它可能是我需要的.它轻巧,小巧,坚固耐用.现在我只需要确保它的表现.哦,和CImage(我忘了在列表中提到它) - 不喜欢它的性能(虽然我不得不承认,模板实现的想法很可爱,至少可以说)

c c++ performance open-source image

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

使用网络摄像头确定骨架关节(不是Kinect)

我正在尝试使用常规网络摄像头确定骨架关节(或者至少能够跟踪单个手掌).我在网上看了一遍,似乎无法找到办法.

我发现的每个例子都是使用Kinect.我想使用一个网络摄像头.

我不需要计算关节的深度 - 我只需要能够识别它们在框架中的X,Y位置.这就是我使用网络摄像头而不是Kinect的原因.

到目前为止,我已经看过了:

  • OpenCV(其中的"骨架"功能是简化图形模型的过程,但它不是人体的检测和/或骨架化).
  • OpenNI(使用NiTE) - 获得关节的唯一方法是使用Kinect设备,因此这不适用于网络摄像头.

我正在寻找一个C/C++库(但此时会查看任何其他语言),最好是开源(但同样,会考虑任何许可),可以执行以下操作:

  • 给定图像(来自网络摄像头的帧)计算可见关节的X,Y位置
  • [可选]给定视频捕获流回调到我的代码中,并显示关节位置的事件
  • 不一定非常准确,但更喜欢它非常快(每帧0.1秒的处理时间)

如果有人可以帮我解决这个问题,我将非常感激.我已经被困在这几天了,没有明确的道路可以继续.

UPDATE

2年后,找到了一个解决方案:http://dlib.net/imaging.html#shape_predictor

webcam opencv tracking gesture-recognition human-interface

26
推荐指数
3
解决办法
4万
查看次数

lambda函数的静态数组(C++)

我想做这样的事情(在课堂上):

static constexpr MyStruct ops[6] = {
    {'+', [&] (double a, double b) { return a+b; } },
    {'-', [&] (double a, double b) { return a-b; } },
    ...
};
Run Code Online (Sandbox Code Playgroud)

在哪里MyStruct定义为:

typedef double (*binOp)(double, double);
struct MyStruct {
    char c;
    binOp fn;
};
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

std::function <double(double,double)> fn;
Run Code Online (Sandbox Code Playgroud)

对于定义fn,但没有运气.

我得到的第一种情况的错误"错误:字段初始化程序不是常量",我真的没有.如果我尝试std::function它会变得更糟,因为它说:"在声明时不能通过非常量表达式初始化".

为什么lambda函数不是常数?我错过了什么吗?

c++ lambda c++11

10
推荐指数
1
解决办法
3694
查看次数

gcc过度对齐的新支持(alignas)

我在查找有关GCC的对齐新警告和gcc -faligned-new选项的更多信息时遇到了一些困难.在gcc 7.2.0上编译(没有--std = c ++ 17)并尝试定义一个对齐的结构,例如:

struct alignas(64) Foo { int x; }
Run Code Online (Sandbox Code Playgroud)

做一个简单的旧:

Foo * f = new Foo();
Run Code Online (Sandbox Code Playgroud)

给我以下警告和建议:

 alignas.cpp:36:25: warning: ‘new’ of type ‘Foo’ with extended alignment 64 [-Waligned-new=]
 Foo * f = new Foo();
                     ^
 alignas.cpp:36:25: note: uses ‘void* operator new(long unsigned int)’, which does not have an alignment parameter
 alignas.cpp:36:25: note: use ‘-faligned-new’ to enable C++17 over-aligned new support
Run Code Online (Sandbox Code Playgroud)

据我所知,默认情况下new只返回内存对齐alignof( std::max_align_t )(对我而言是16),但我不清楚的是,如果我传递-faligned-new,gcc现在会new代表我强制执行新的对齐吗?

不幸的是,关于这个的gcc文档非常缺乏.

c++ gcc gcc-warning alignas

9
推荐指数
1
解决办法
3682
查看次数

int 位域的大小和对齐方式

具有位域的结构,即使在“打包”时,似乎也会根据指定的 int 类型来处理位域的大小(以及对齐方式?)。有人可以指出定义该行为的 C++ 规则吗?我尝试了十几个编译器和体系结构(谢谢你,编译器资源管理器!),结果在所有编译器和体系结构中都是一致的。

这是要使用的代码: https: //godbolt.org/z/31zMcnboY

#include <cstdint>

#pragma pack(push, 1)
struct S1{ uint8_t  v: 1; }; // sizeof == 1
struct S2{ uint16_t v: 1; }; // sizeof == 2
struct S3{ uint32_t v: 1; }; // sizeof == 4
struct S4{ unsigned v: 1; }; // sizeof == 4
#pragma pack(pop)

auto f(auto s){ return sizeof(s); }

int main(){
    f(S1{});
    f(S2{});
    f(S3{});
    f(S4{});
}
Run Code Online (Sandbox Code Playgroud)

生成的 ASM 清楚地显示了、 的返回大小分别f()为 1、2、4 :S1S2 …

c++ bit-packing language-lawyer bit-fields structure-packing

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

将 YUV 绕过 RGB 步骤转换为 HSL 或 HSV

维基百科和大量在线资源为 RGB 之间的各种颜色空间转换提供了详细且丰富的帮助。我需要的是直接的 YUV->HSL/HSV 转换

\n\n

事实上,我需要的只是色调(不太关心饱和度或亮度亮度/值)。换句话说,我只需要计算给定 YUV 颜色的“颜色角度”。

\n\n

任何语言的代码就足够了,尽管我更喜欢 C 风格的语法。

\n\n

请注意,YUV 我指的是 Y\xe2\x80\xb2UV,又名 YCbCr(如果这有什么区别的话)。

\n

hsl colors yuv hsv color-space

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

在类中实现移动语义的规范方法

我正在寻找一个很好的例子,说明如何使用移动语义实现派生类和基类。我想得越多,似乎默认的移动构造函数和赋值移动运算符通常都能完成这项工作,因为大多数标准 (STL) 类型和智能指针都是默认可移动的。

无论如何,如果我们有一个类层次结构,它需要一个明确的移动实现,我应该怎么做 - 至少作为第一次切割?

在这个例子中,我使用了一个原始指针,我通常将它包装在 std::unique_ptr 中,但我需要一个移动的例子,它不是默认可移动的。

任何帮助将非常感激。:)

目前,我做了以下尝试:

struct BlobA
{
    char data[0xaa];
};

struct BlobB
{
    char data[0xbb];
};

//----------------------------------------

class Base
{
public:

    //Default construct the Base class
    //C++11 allows the data members to initialised, where declared. Otherwise you would do it here.
    Base()
    {

    }

    //Define the destructor as virtual to ensure that the derived destructor gets called. (In case it is necessary. It's not in this example but still good practice.)
    virtual ~Base() …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 c++14

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

链接可变参数函数调用

printf类函数从不同的参数个数函数调用很容易足以让-只使用一个v的那些功能(-version vprintfvsprintfCString::FormatV,等)。但是,如果我将呼叫链接起来怎么办?这是简单的代码:

#include <stdarg.h>
#include <iostream>
void direct(const char * _fmt, bool _extra, ...){
    va_list args;
    va_start(args, _extra);

    char ca[200];
    vsprintf(ca, _fmt, args);
    std::cout << ca << std::endl;

    va_end(args);
}

void chained(const char * _fmt, ...){
    va_list args;
    va_start(args, _fmt);
    direct(_fmt, false, args);
    va_end(args);
}

int main(){
    direct("direct works just fine: %d", false, 1);
    chained("indirect produces garbage: %d", 1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

示例输出如下:

direct works just fine: 1
indirect produces garbage: …
Run Code Online (Sandbox Code Playgroud)

c c++ variadic-functions

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

如果仍然需要互斥锁才能正常工作,为什么要使用 std::atomic

阅读文本,因为std::condition_variable我遇到了这句话:

即使共享变量是原子的,也必须在互斥锁下进行修改,才能将修改正确发布到等待线程。

我的问题是这样的:

如果不是“与 POD 一起工作的无锁代码”,原子有什么用?

更新

看起来我的问题有些混乱:(

引用文本中的“共享变量”与“条件变量”不同。请参阅同一页面中的此引用:

...直到另一个线程同时修改共享变量(条件),并通知condition_variable

请不要回答“为什么我们需要使用带有条件变量的互斥锁”或“条件等待如何工作”,而是提供有关互斥锁的使用如何“正确发布”对等待线程的原子修改的信息,即是否需要在互斥锁下完成像++counter;而不是像测试if(counter == 0))这样的表达式?

c++ mutex atomic stdatomic stdmutex

-1
推荐指数
1
解决办法
681
查看次数