我读到结构中位字段的顺序是特定于平台的.如果我使用不同的特定于编译器的打包选项,这将保证数据在写入时以正确的顺序存储吗?例如:
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++版本,C就足够了).
我正在寻找的主要功能是:
ImageMagik
,这是真正全面的但是是猛犸象)stb_image.c
,错误恢复非常差)CxImage
了很多年但是最新版本我遇到了MSVC 2010的问题,看起来它的积极开发和支持已经消失了,所以我即将放弃它)libpng
由于某种原因我查看和解雇的图书馆:
简而言之,我只想要尽可能小的东西,尽可能快地以牺牲绝对最小的功能为代价,但到目前为止我还没找到合适的候选者.
请问这个社区有什么建议吗?但请记住我上面列出的限制 - 我不认为抛出表格的答案"你试过X吗?" "X"不符合我需要的一半:)
编辑:进一步了解DevIL似乎它可能是我需要的.它轻巧,小巧,坚固耐用.现在我只需要确保它的表现.哦,和CImage(我忘了在列表中提到它) - 不喜欢它的性能(虽然我不得不承认,模板实现的想法很可爱,至少可以说)
我正在尝试使用常规网络摄像头确定骨架关节(或者至少能够跟踪单个手掌).我在网上看了一遍,似乎无法找到办法.
我发现的每个例子都是使用Kinect.我想使用一个网络摄像头.
我不需要计算关节的深度 - 我只需要能够识别它们在框架中的X,Y位置.这就是我使用网络摄像头而不是Kinect的原因.
到目前为止,我已经看过了:
我正在寻找一个C/C++库(但此时会查看任何其他语言),最好是开源(但同样,会考虑任何许可),可以执行以下操作:
如果有人可以帮我解决这个问题,我将非常感激.我已经被困在这几天了,没有明确的道路可以继续.
UPDATE
2年后,找到了一个解决方案:http://dlib.net/imaging.html#shape_predictor
我想做这样的事情(在课堂上):
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函数不是常数?我错过了什么吗?
我在查找有关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文档非常缺乏.
具有位域的结构,即使在“打包”时,似乎也会根据指定的 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 :S1
S2 …
c++ bit-packing language-lawyer bit-fields structure-packing
维基百科和大量在线资源为 RGB 之间的各种颜色空间转换提供了详细且丰富的帮助。我需要的是直接的 YUV->HSL/HSV 转换。
\n\n事实上,我需要的只是色调(不太关心饱和度或亮度亮度/值)。换句话说,我只需要计算给定 YUV 颜色的“颜色角度”。
\n\n任何语言的代码就足够了,尽管我更喜欢 C 风格的语法。
\n\n请注意,YUV 我指的是 Y\xe2\x80\xb2UV,又名 YCbCr(如果这有什么区别的话)。
\n我正在寻找一个很好的例子,说明如何使用移动语义实现派生类和基类。我想得越多,似乎默认的移动构造函数和赋值移动运算符通常都能完成这项工作,因为大多数标准 (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) 一printf
类函数从不同的参数个数函数调用很容易足以让-只使用一个v的那些功能(-version vprintf
,vsprintf
,CString::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) 阅读文本,因为std::condition_variable
我遇到了这句话:
即使共享变量是原子的,也必须在互斥锁下进行修改,才能将修改正确发布到等待线程。
我的问题是这样的:
如果不是“与 POD 一起工作的无锁代码”,原子有什么用?
更新
看起来我的问题有些混乱:(
引用文本中的“共享变量”与“条件变量”不同。请参阅同一页面中的此引用:
...直到另一个线程同时修改共享变量(条件),并通知condition_variable
请不要回答“为什么我们需要使用带有条件变量的互斥锁”或“条件等待如何工作”,而是提供有关互斥锁的使用如何“正确发布”对等待线程的原子修改的信息,即是否需要在互斥锁下完成像++counter;
(而不是像测试if(counter == 0)
)这样的表达式?
c++ ×8
c ×3
c++11 ×2
alignas ×1
atomic ×1
bit ×1
bit-fields ×1
bit-packing ×1
c++14 ×1
color-space ×1
colors ×1
endianness ×1
gcc ×1
gcc-warning ×1
hsl ×1
hsv ×1
image ×1
lambda ×1
mutex ×1
open-source ×1
opencv ×1
performance ×1
stdatomic ×1
stdmutex ×1
tracking ×1
webcam ×1
yuv ×1