如果我将operand->type() == typeid(ValueType)下面的行更改为&operand->type() == &typeid(ValueType),代码仍然可以使用gcc并在可执行文件中占用更少的空间(并且多年来已经这样做了),但是C++ 11标准是否给出了任何保证,这种优化应该可以解决不同的编译器?
template<typename ValueType>
ValueType * any_cast(any * operand)
{
return operand &&
#ifdef BOOST_AUX_ANY_TYPE_ID_NAME
std::strcmp(operand->type().name(), typeid(ValueType).name()) == 0
#else
operand->type() == typeid(ValueType)
#endif
? &static_cast<any::holder<ValueType> *>(operand->content)->held
: 0;
}
Run Code Online (Sandbox Code Playgroud) 我知道在浮点数和整数之间进行转换时可能出现的错误,但性能如何(请忽略准确性问题)?
一般来说,如果我对不同算术类型的操作数进行n-ary操作,即不同的浮点类型(例如float和double)和浮点/整数类型组合(例如float和int),性能是否会受到影响?是否存在经验法则,例如,保持所有操作数相同?
PS:我在问,因为我正在编写一个表达式模板库,想知道是否允许对包含不同算术类型值的向量进行二进制运算.
显然,关于这个问题,编译器之间存在一些混淆和差异:
根据这篇文章:
什么是右值、左值、xvalues、glvalues 和 prvalues?
Xvalues 是 rvalues(与 prvalues 一起),标准说:
第二个上下文是引用绑定到临时对象时。引用绑定到的临时对象或作为引用绑定到的子对象的完整对象的临时对象在引用的生命周期内持续存在,除了:
然而,有一些帖子对此提出异议:
什么是非 POD 对象的 xvalue 和 prvalue 之间允许的使用或行为差异的示例?
有人可以澄清这个问题。MSVC 适合一次吗?
我的问题是:
现在lambda仿函数是C++的一部分,它们可以用来整理类的接口.lambda如何使用vs私有方法在C++中使用compare?unclutter类接口是否存在更好的替代方案?
如果我实现这样的C回调:
register_callback([](/*some args*/){/*some stuff*/});
Run Code Online (Sandbox Code Playgroud)
触发时我得到一个SIGSEGV,但如果我这样注册:
auto const f([](/*some args*/){/*some stuff*/});
register_callback(f);
Run Code Online (Sandbox Code Playgroud)
然后它工作正常.(对我来说)特别感兴趣的是地址消毒剂产生的堆栈跟踪:
ASAN:SIGSEGV
=================================================================
==22904==ERROR: AddressSanitizer: SEGV on unknown address 0x7f1582c54701 (pc 0x7f1582c54701 sp 0x7f1582c544a8 bp 0x7f1582c54510 T2)
#0 0x7f1582c54700 ([stack:22906]+0x7fc700)
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV ??:0 ??
Run Code Online (Sandbox Code Playgroud)
它看起来好像函数指针指向堆栈.将lambda推入堆栈会将代码压入堆栈吗?由于我没有捕获任何函数指针的位置对我来说是一个谜.怎么了?没有使用优化标志.我不是在寻找解决方法.
编辑:显然'+'是一个工作示例的关键.我不知道为什么有必要.使用compile删除'+'和示例,但将使用clang-3.5和触发SIGSEGV gcc-4.9.
#include <curl/curl.h>
#include <ostream>
#include <iostream>
int main()
{
auto const curl(curl_easy_init());
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "cnn.com");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
/*
auto const f([](char* const ptr, size_t const size, size_t const …Run Code Online (Sandbox Code Playgroud) 我有这样的代码:
template <typename T>
inline typename ::std::enable_if<
is_std_tuple<T>{},
T
>::type
get()
{
// pull tuple's elements from somewhere
}
Run Code Online (Sandbox Code Playgroud)
为了推导出元组实例化的模板类型参数,我做了这个演员:
static_cast<T*>(nullptr)
Run Code Online (Sandbox Code Playgroud)
并将其作为参数传递给函数
template <typename ...A>
void deduce_tuple(::std::tuple<A...>* const);
Run Code Online (Sandbox Code Playgroud)
我承诺UB吗?有没有更好的办法?
c++ templates language-lawyer template-argument-deduction c++14
我想要一个constexpr可以为每个C ++类型返回唯一ID 的函数,如下所示:
using typeid_t = uintptr_t;
template <typename T>
constexpr typeid_t type_id() noexcept
{
return typeid_t(type_id<T>);
}
int main()
{
::std::cout << ::std::integral_constant<typeid_t, type_id<float>()>{} << ::std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是我得到一个错误:
t.cpp: In function 'int main()':
t.cpp:23:69: error: conversion from pointer type 'typeid_t (*)() noexcept {aka long unsigned int (*)() noexcept}' to arithmetic type 'typeid_t {aka long unsigned int}' in a constant-expression
::std::cout << ::std::integral_constant<typeid_t, type_id<float>()>{} << ::std::endl;
^
t.cpp:23:69: note: in template argument for type 'long unsigned …Run Code Online (Sandbox Code Playgroud) 通过传递多个参数是否::std::initializer_list比可变参数函数模板方法有任何优势?
在代码中:
template <typename T> void f(::std::initializer_list<T> const);
template <typename ...A> void f(A&& ...args);
Run Code Online (Sandbox Code Playgroud)
请注意,A...也可以通过 SFINAE 或将类型限制为单一类型static_assert()。参数可以通过......
我想切换float和double值的"endianness",它可以正常工作,例如:
float const v{1.f};
swap(reinterpret_cast<::std::uint32_t const&>(v));
Run Code Online (Sandbox Code Playgroud)
没有强制转换,是否存在更好的交换方式?
编辑:swap()是gcc内置函数的C++包装器,我没有在这里包含它.
uint16_t __builtin_bswap16 (uint16_t x)
uint32_t __builtin_bswap32 (uint32_t x)
uint64_t __builtin_bswap64 (uint64_t x)
Run Code Online (Sandbox Code Playgroud)
对于某些数据格式,例如CBOR,需要交换字节序.
这是一个愚蠢的问题,但是...我最近玩过djgpp并且很惊讶可以编译/链接现代c ++ 17代码到32位dos二进制文件.Mingw涵盖了win32和win64.但就win16而言,存在一个巨大的漏洞.有没有能够生成16位代码的c ++ 17编译器(用于dos,windows或任何其他操作系统)?