我有存储POD结构的数据结构(每个实例仅存储一个类型,因为它基本上是一个特定POD结构的数组).有时候另一个开发 将修改其中一个结构,添加或修改数据类型.如果添加了非POD元素,例如std :: string,则数据结构在运行时会爆炸,因为内存模型会发生变化.有没有办法在运行时使用编译器定义或调用来检测类或结构是否符合POD(以避免此维护问题)?我正在使用g ++(GCC)4.2.4.
我有一个类和一个const变量.
struct A
{
int b;
};
A const a;
Run Code Online (Sandbox Code Playgroud)
该类A是POD,可以像这样初始化.
A const a = { 3 };
Run Code Online (Sandbox Code Playgroud)
恕我直言,有这样的构造函数看起来很好.
struct A
{
int b;
A(int newB) : b(newB)
{
}
};
Run Code Online (Sandbox Code Playgroud)
但Clang假定A为非聚合类型.为什么我不能有这样的构造函数?或者我应该做些什么?
我修改了问题来表达我原来的意思.我已经写了struct为class错误,并抱歉@Johannes约困惑:)
我正在阅读关于C++ POD,Trivial和Standard Layout类的精彩文章 我对标准布局没有清楚了解的一个属性如下: -
A standard layout has no base classes of the same type as the first
non-static data member
Run Code Online (Sandbox Code Playgroud)
因此,以下将不是标准布局,因为它具有与基类相同的第一个成员
struct NonStandardLayout3 : StandardLayout1 {
StandardLayout1 x; // first member cannot be of the same type as base
};
Run Code Online (Sandbox Code Playgroud)
但是在性能方面和属性方面,上述结构有何不同
struct StandardLayout5 : StandardLayout1 {
int x;
StandardLayout1 y; // can have members of base type if they're not the first
};
Run Code Online (Sandbox Code Playgroud)
这是对此之上的修正.
指针不能直接保存到文件中,因为它们指向绝对地址.为了解决这个问题,我写了一个relative_ptr模板,它包含一个偏移而不是一个绝对地址.
基于这样一个事实,即只能逐个安全地复制普通的可复制类型,我假设这种类型需要通过简单的可复制来安全地保存在内存映射文件中并在以后检索.
这种限制结果有点问题,因为编译器生成的复制构造函数不会以有意义的方式运行.我没有发现任何禁止我违反复制构造函数并将其设为私有的内容,因此我将其设为私有以避免意外复制,从而导致未定义的行为.
后来,我发现boost::interprocess::offset_ptr他的创作是由同样的需求驱动的.然而,事实证明,offset_ptr它不是简单的可复制,因为它实现了自己的自定义复制构造函数.
我的假设是智能指针需要轻易复制才能安全地持久存在错误吗?
如果没有这样的限制,我想知道我是否也可以安全地执行以下操作.如果没有,那么类型必须满足哪些要求才能在上述场景中使用?
struct base {
int x;
virtual void f() = 0;
virtual ~base() {} // virtual members!
};
struct derived : virtual base {
int x;
void f() { std::cout << x; }
};
using namespace boost::interprocess;
void persist() {
file_mapping file("blah");
mapped_region region(file, read_write, 128, sizeof(derived));
// create object on a memory-mapped file
derived* d = new (region.get_address()) derived();
d.x = 42;
d->f();
region.flush();
}
void retrieve() { …Run Code Online (Sandbox Code Playgroud) 错误:System / Library / Frameworks / Ruby.framework / Versions / 2.3 / usr / bin / ruby:错误的解释器:无此类文件或目录
在Mac OS卡塔利娜
我很长一段时间都是Perl程序员,但我在POD中的文档总是有问题.
当我在代码中使用POD注释时,代码很难阅读.当我在文件末尾使用POD注释时,存在文档与代码不同步的危险.
我想念一个类似于Java的文档样式.
/**
* @description
* ...
*/
Run Code Online (Sandbox Code Playgroud)
我寻找更简单,更直观的文档样式.有这样的事吗?
这个例子:
#include <iostream>
#include <cstring>
struct A
{
int a;
bool b;
};
bool foo( const A a1, const A a2 )
{
return ( 0 == std::memcmp( &a1, &a2, sizeof( A ) ) );
}
int main()
{
A a1 = A();
a1.a = 5;a1.b = true;
A a2 = A();
a2.a = 5;a2.b = true;
std::cout<<std::boolalpha << foo( a1, a2 ) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
false由于填充,将产生.
我没有访问该foo功能,我无法改变比较的方式.
假设bool占用1个字节(在我的系统上也是如此),如果我将其更改struct A为:
struct A
{ …Run Code Online (Sandbox Code Playgroud) 已经安装了react-native-firebase&,我正在使用我的project.xcworkspace在iOS上使用Xcode进行构建,这在我只安装auth和core软件包时很好。当我安装消息传递软件包时,无论如何我都会得到错误“找不到-lRCTGeolocation的库”。有些可以帮助我吗?
react-native:0.60.3 react-native-firebase:5.5.4
提前感谢。
我从pod文件中删除了消息传递参考,删除了pods文件夹和podfile.lock文件,重新安装了pods,清理了构建但没有解决。
在这份文件中,作者说
只有POD类型可以作为省略号"..."的参数,而std :: string不是POD类型.
我理解为这个Passing NON-POD type to Variadic function is undefined behavior.这样对吗?
虽然,他是说C/C++标准吗?我试图在n3242 C++规范中找到它.但找不到.
我想知道我的理解是正确的,这是一个标准.
我知道默认情况下会初始化一些POD变量,但其他变量不是.(POD类型包括int,float指针,联合,POD类型的数组,POD类型的结构等)
范围和存储类如何影响POD类型的默认初始化?
具体而言,将隐式初始化以下哪项:
new我知道存在一些与这些情况有关的问题,但没有全面的问题(它们只涉及具体情况).
pod ×10
c++ ×7
ios ×2
react-native ×2
c ×1
c++11 ×1
comparison ×1
constructor ×1
installation ×1
perl ×1
perldoc ×1
persistence ×1
standards ×1
xcode ×1