草庐IT

c++ - 读取和比较 POD 类型的填充字节是未定义的行为吗?

今天我遇到了一些大致类似于以下代码段的代码。valgrind和UndefinedBehaviorSanitizer都检测到未初始化数据的读取。templatevoidfoo(constT&x){static_assert(std::is_pod_v&&sizeof(T)>1);autop=reinterpret_cast(&x);std::size_ti=1;for(;i上述工具提示p[i]!=p[0]比较时包含填充字节的对象已传递给foo。示例:structobj{charc;int*i;};foo(obj{'b',nullptr});从POD类型中读取填充字节并将它们与其他内容进行

c++ - 关于 C++ 非 POD union 的问题

C++11让我们可以在union中使用非POD类型,比如我有以下代码;union{Tone;Vtwo;}uny;在我类的某个地方,一次只有一个成员会活跃,现在我的问题很简单。uny的默认值是多少?-未定义?每当我的类(class)被破坏时,哪些成员(在union内)将被破坏(如果有的话)?假设我必须使用std::typeinfo来跟踪哪个是事件成员,那么我是否应该在析构函数中显式调用该成员的析构函数?是否有人提供语言提案的链接,该提案将union更改为接受非POD类型? 最佳答案 您大部分时间都靠自己。标准中的注释解释了这一点(9.

c++ - 如何使 is_pod<T> 测试在编译期间而不是执行期间执行?

这可能是一个简单的问题,我根本不掌握C++11模板。我有一个不是std::vector的通用vector类出于性能原因(非常具体的代码)。我观察到检查T是否是POD,当它是时,执行特殊计算比不是更有效:voidvec::clear(){if(!std::is_pod::value){for(inti=0;i这里,我不调用T的析构函数对于每个项目(size可能非常大),性能确实得到了提升。但是测试if(!std::is_pod::value)模板编译后就没用了:而不是编译为:voidvec::clear(){if(false){for(inti=0;i我希望它被编译成:voidvec::

c++ - 如何将 BUCK 构建与具有多个同名文件的 pod 一起使用?

我正在尝试将BUCK与Realmpod一起使用.我已将我的buck文件设置为:apple_pod_lib(name="Realm",visibility=["PUBLIC"],exported_headers=glob(["Realm/**/*.h","Realm/**/*.hpp",]),srcs=glob(["Realm/**/.{m,mm,cpp}",]),)apple_pod_lib(name="RealmSwift",visibility=["PUBLIC"],swift_version="4",deps=["//Pods:Realm"],srcs=glob(["RealmS

c++ - C++ 标准是否允许对具有 const 成员的 POD 对象进行零初始化?

我已经定义了一个POD,打算将其用作不可变数据存储。为此,我将其成员限定为const,并期望对实例进行值初始化(并且在某些情况下进行零初始化)。考虑以下代码:structFoo{constintvalue;};intmain(){Foofoo{};return0;}当我尝试对此POD进行零初始化时,由于Foo::value上的const限定符,我在VisualStudio(C3852)中收到编译器错误.如果我删除限定符,代码编译得很好。确切的错误信息是:errorC3852:'Foo::value'havingtype'constint':aggregateinitialization

c++ - POD 结构或标准布局类型的成员是否保证根据其对齐要求对齐?

给定一个POD结构(在C++03中)或标准布局类型(在C++11中),所有成员都有基本对齐要求,是否保证每个成员都按照它的对齐要求?换句话说,对于标准布局类型Sm0...mn}中的所有成员m_k,structS{T0m0;T1m1;...TNmn;};是否保证以下表达式的计算结果为true?(offsetof(S,m_k)%alignof(decltype(S::m_k)))==0请给出C++03和C++11的答案并引用标准的相关部分。来自C标准的支持证据也会有所帮助。我对C++03标准(ISO/IEC14882:2003(E))的解读是,除了第一个成员外,它对POD结构中成员的对齐保

c++ - 如何创建线程安全的缓冲区/POD?

我想我的问题很常见,但它让我发疯:我有一个具有5个线程的多线程应用程序。其中4个线程完成它们的工作,例如网络通信和本地文件系统访问,然后将它们的输出全部写入这种形式的数据结构中:structBuffer{std::vectorlines;boolhas_been_modified;}第5个线程将这些缓冲区/结构打印到屏幕上:Bufferbuf1,buf2,buf3,buf4;...if(buf1.has_been_modified||buf2.has_been_modified||buf3.has_been_modified||buf4.has_been_modified){redra

c++ - 什么是非 POD 对象的 xvalue 和 prvalue 之间允许的使用或行为差异的示例?

Whatarervalues,lvalues,xvalues,glvalues,andprvalues?很好地概述了右值/左值的分类,最近对该问题的回答之一(https://stackoverflow.com/a/9552880/368896)强调了右值“类似于”旧式右值,而新的xvalues允许“左值-喜欢”的行为。但是,请考虑以下代码:classX{};Xfoo(){returnX();}intmain(){foo()=X();//foo()isaprvaluethatsuccessfullyappearsonthelhs}在本例中,表达式foo()是出现在左侧的纯右值,并接受赋值

c++ - 我是否需要将类型设为 POD 才能将其与内存映射文件一起保存?

指针不能直接保存到文件,因为它们指向绝对地址。为了解决这个问题,我编写了一个relative_ptr模板,它包含一个偏移量而不是一个绝对地址。基于只有可简单复制的类型才能安全地逐位复制的事实,我假设这种类型需要可简单复制才能安全地保存在内存映射文件中并稍后检索。这个限制结果有点问题,因为编译器生成的复制构造函数没有以有意义的方式运行。我发现没有任何东西可以阻止我默认复制构造函数并将其设为私有(private),因此我将其设为私有(private)以避免可能导致未定义行为的意外复制。后来发现boost::interprocess::offset_ptr他们的创作是由同样的需求驱动的。然而

c++ - C++ POD 类型何时进行零初始化?

来自C背景,我一直认为POD类型(例如int)在C++中从未自动零初始化,但似乎这是完全错误的!我的理解是,只有“裸”的非静态POD值不会被填零,如代码片段所示。我是否做对了,是否还有其他重要的案例我遗漏了?staticinta;structFoo{inta;};voidtest(){intb;Foof;int*c=new(int);std::vectord(1);//Atthispoint...//aiszero//f.aiszero//*ciszero//d[0]iszero//...BUT...bisundefined} 最佳答案