这是一个POD吗?
template <class T>
struct Data {
float val_f;
T val_t;
int val_i;
};
Run Code Online (Sandbox Code Playgroud)
如果我有一个C函数需要类似的东西:
struct Data {
float val_f;
double val_t;
int val_i;
};
Run Code Online (Sandbox Code Playgroud)
我可以通过一个Data<double>
对象吗?
PS.我猜答案是肯定的,因为在编译时,Data<dobule>
它将被转换为上面的结构,并且将是POD结构.我需要公正和(知情)确认.
结构像
struct ifoo_version_42 {
int x, y, z;
char *imageData;
};
Run Code Online (Sandbox Code Playgroud)
在哪里imageData
是这样的imageData = new char[50000];
我们可以执行以下操作:
template< typename T >
void del( T a ) // we promise to use this only on C Plain Old data structs=)
{
delete a;
}
Run Code Online (Sandbox Code Playgroud)
在这个结构上,它是否足以清理记忆形式,如果?
我是Haskell的新手.
在静态类型的OO语言(例如,Java)中,所有复杂的数据结构都表示为类和实例.对象可以具有许多属性(字段).另一个对象可以是该字段的值.可以使用其名称访问这些字段,并按类静态键入.最后,这些对象构建了彼此链接的巨大对象图.大多数程序都使用这样的数据图.
如何在Haskell中归档这些功能?
假设我有这个结构:
struct vector_data
{
double x, y;
double& operator[](size_t index)
{
return * (static_cast<double*>(static_cast<void*>(this)) + index);
}
};
Run Code Online (Sandbox Code Playgroud)
operator []应该按预期工作,因为vector_data是POD类型.预期的行为是vector_data [0]返回x,vector_data [1]返回y.
现在假设我有第二个结构:
struct more_data
{
double evil_data;
// There could be more here, data or functions
};
Run Code Online (Sandbox Code Playgroud)
并且来自这两个:
struct composed : public more_data, public vector_data
{
};
Run Code Online (Sandbox Code Playgroud)
请问这个destory运算符[]的预期行为?换句话说,派生结构中的vector_data的this-pointer是否仍然指向struct的vector_data部分,还是指向派生结构的开头?
如果它确实破坏了operator [],那么我该如何解决这个问题呢?我可以先从vector_data继承,但假设compos包含虚函数.我知道大多数编译器都将vtable放在最后,但这并不能保证.什么是最好的方法?
这是我的Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, '10.0'
# Pods for BandUJam
target 'BandUJam' do
pod 'Masonry'
pod 'SDWebImage'
pod 'VODUpload'
pod "AFNetworking",'~> 3.1.0'
pod "SDWebImage"
pod "UMengUShare/Social/WeChat"
pod 'AliyunPlayer_iOS'
pod 'Toast', '~> 4.0.0'
pod 'UITextView+Placeholder', '~> 1.2'
end
Run Code Online (Sandbox Code Playgroud)
当我"pod install"或"pod update"
然后在终端收到此消息
Analyzing dependencies
??? MARKDOWN TEMPLATE ???????????????????????????????????????????????????????????
### Command
```
/usr/local/bin/pod install
```
### Report
* What did you do?
* What did you expect to happen?
* What …
Run Code Online (Sandbox Code Playgroud) 我有一个具有master和1个节点的kubernetes安装。
它已经配置好,一切都很好。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mantis-gfs 1/1 Running 1 22h
mongodb-gfs 1/1 Running 0 14h
Run Code Online (Sandbox Code Playgroud)
我暴露了pod mongodb-gfs:
$ kubectl expose pod mongodb-gfs --port=27017 --external-ip=10.9.8.100 --name=mongodb --labels="env=development"
Run Code Online (Sandbox Code Playgroud)
外部IP 10.9.8.100是kubernetes主节点的IP
服务已成功创建。
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
glusterfs-cluster ClusterIP 10.111.96.254 <none> 1/TCP 23d
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 29d
mongodb ClusterIP 10.100.149.90 10.9.8.100 27017/TCP 1m
Run Code Online (Sandbox Code Playgroud)
现在,我可以使用以下方式访问mongo了:
mongo 10.9.8.100:27017
Run Code Online (Sandbox Code Playgroud)
这就是问题所在。它可以工作一段时间,但有时不能。我连接一次,得到外壳,第二次连接,得到:
$ mongo 10.9.8.100:27017
MongoDB shell version v3.4.17
connecting to: mongodb://10.9.8.100:27017/test
2018-11-01T09:27:23.524+0100 W NETWORK …
Run Code Online (Sandbox Code Playgroud) 我有跟随pod使用getopt :: long:
=head1 SYNOPSIS foo [OPTION]... [URL]... =head1 OPTIONS =over 20 =item B<-h, --help> Print a brief help message and exits. =item B<-i, --input=FILE> Reads from FILE =back =cut
当我提供-h它产生:
Usage: foo [OPTION]... [URL]... Options: -h, --help Print a brief help message and exits. -i, --input=FILE Reads from FILE
我的问题是:如何删除-h和-i之间的空行?
首先,这更像是一个健全性检查问题,以获得一些比我更熟悉语言标准深度的人的认可.
假设我有以下类型(虽然我省略了任何非构造函数和非赋值成员函数):
template<typename E> struct half_expr
{
};
class half : public half_expr<half>
{
public:
half();
explicit half(float);
template<typename E> half(const half_expr<E>&);
half& operator=(float);
template<typename E> half& operator=(const half_expr<E>&);
private:
half(std::uint16_t, bool);
std::uint16_t data_;
};
Run Code Online (Sandbox Code Playgroud)
好吧,在任何合理的实现上half
,内存中的其他东西不应该是普通的std::uint16_t
.但我对标准的保证感兴趣.根据POD的C++ 98/03定义,这是我的理由:
half
不能是POD类型,因为它具有非公共字段,基类和用户定义的构造函数.和C++ 11失败/扩展定义:
它应该是可以轻易复制的,因为它只隐式生成了复制/移动构造函数/赋值,但只要这些float
和模板版本不以任何方式计数,我不完全确定.
它也应该是标准布局,因为它只有一个基本类型的私有字段和一个空的非虚拟基类(在任何标准中都应该是POD,对吗?)
阻碍POD分类的唯一因素是它不是简单的默认构造,可以通过使用C++ 11的half() = default
语法来克服IMHO .
我的一个非常简单的问题是:我的理由是完全正确还是在定义中有任何我忽略或误解的东西,特别是考虑到用户定义的构造函数和赋值会以某种方式阻碍分类的简单复制?
注意:即使你觉得有必要将这一点委托给一些关于POD和标准布局类型的可能重复(我可以完全理解),回答我实际问题的简单评论仍然会很好,因为这只是一个简单的检查,这可能对你来说简单或过分,但我只想保持安全.
struct A
{
int i;
};
struct B
{
B(){}
int i;
}
Run Code Online (Sandbox Code Playgroud)
大家好
我知道"POD意味着普通旧数据类型,根据定义,它不能具有用户定义的构造函数".但是,当"定义具有用户定义的默认值"时,我无法理解为什么此规则有效.
它们的内存布局没有区别.为什么A类是POD,而不是B?
在stxxl
FAQ中,我发现了这个:
参数化STXXL容器
像stxxl :: vector这样的STXXL容器类型只能使用值为POD的值类型(即没有虚函数,没有用户定义的复制赋值/析构函数等)进行参数化,并且不包含对内部存储器的引用(包括指针).通常,"复杂"数据类型不满足此要求.
这就是原因
stxxl::vector<std::vector<T> >
,stxxl::vector<stxxl::vector<T> >
也是无效的.如果合适,std::vector<stxxl::vector<T> >
通过索引计算使用 或模拟二维数组.
无法使用stxxl::vector<std::vector<T> >
使得完美有意义,因为stxxl
容器在容器调整大小时不会调用所包含元素的构造函数或析构函数.但是如何存储这样的结构:
struct S {
int* a;
}
Run Code Online (Sandbox Code Playgroud)
如果我确保a
只要stxxl::vector<S>
实例存在,指向的对象是有效的,那么将其存储struct
到一个问题中会出现什么问题stxxl::vector<S>
?如果必须将特定实例S
移动到磁盘,则a
指针的值将写入磁盘.稍后,指针值将恢复,我可以使用它.显然,指针值也依赖于机器和依赖于实例,但即使我处理指向对象的生命周期,这也是一个问题吗?我不是通过套接字发送序列化对象,我没有将序列化对象存储在数据库中供以后使用.
我错过了什么吗?
编辑:有人提醒我,stxxl
不会复制指针,因此我可能会在以后检索一个实例时得到一个指向垃圾的指针struct S
.我知道.我保证指针在整个程序的整个生命周期内都是有效的.
pod ×10
c++ ×6
c++11 ×2
c ×1
cocoapods ×1
connection ×1
constructor ×1
haskell ×1
ios ×1
kubernetes ×1
perl ×1
pointers ×1
stxxl ×1
this ×1
type-traits ×1
types ×1
vector ×1
xcode ×1