所以我有一些相当广泛的功能代码,主要数据类型是不可变的结构/类.通过制作成员变量和任何方法const,我一直在声明不变性的方式是"几乎不可变的".
struct RockSolid {
const float x;
const float y;
float MakeHarderConcrete() const { return x + y; }
}
Run Code Online (Sandbox Code Playgroud)
这实际上是C++中"我们应该这样做"的方式吗?或者,还有更好的方法?
c++ functional-programming const-correctness immutability c++11
我正在编写一个测试程序来习惯Clang对OpenCL样式向量的语言扩展.我可以让代码工作,但我遇到了问题的一个方面.我似乎无法弄清楚如何让clang恰好从标量数组中加载一个向量.
目前我必须做一些事情:
byte16 va = (byte16){ argv[1][start], argv[1][start + 1], argv[1][start + 2],
argv[1][start + 3], argv[1][start + 4], argv[1][start + 5],
argv[1][start + 6], argv[1][start + 7], argv[1][start + 8],
argv[1][start + 9], argv[1][start + 10], argv[1][start + 11],
argv[1][start + 12], argv[1][start + 13], argv[1][start + 14],
argv[1][start + 15]};
Run Code Online (Sandbox Code Playgroud)
我理想的喜欢这样的事情:
byte16 va = *(byte16 *)(&(argv[1][start]));
Run Code Online (Sandbox Code Playgroud)
我可以轻松地使用适用于ARM或x86的内在函数.但是该代码会导致程序崩溃,尽管它会编译.
在我最近一直在帮助的项目中,整个代码库依赖于一个可怕的枚举,它被有效地用作美化哈希表的键.唯一的问题是现在它是巨大的,只要枚举更改基本上是对已经很大的代码库的重建就编译.这需要永远,我真的很想替换它.
enum Values
{
Value = 1,
AnotherValue = 2,
<Couple Thousand Entries>
NumValues // Sentinel value for creating arrays of the right size
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是替换这个枚举的方法,但仍然有一个类型安全的系统(没有未经检查的字符串),并且还与MSVC2010兼容(没有constexpr).额外的编译开销是可以接受的,因为编译时可能仍然比重新编译一堆文件更短.
我目前的尝试基本上可以概括为延迟定义值直到链接时间.
其用途的例子
GetValueFromDatabase(Value);
AddValueToDatabase(Value, 5);
int TempArray[NumValues];
Run Code Online (Sandbox Code Playgroud)
编辑:编译时和运行时预处理是可以接受的.同时在运行时基于某种缓存数据结构.
是否有可能哄骗std :: atomic输出CMPXCHG16B用于我对在Windows x64上使用原子互锁操作不感兴趣的类型,或者我只需要吸收它并手动执行原子操作?我可以让GCC/Clang在Linux上这样做,所以我怀疑它只是微软标准库的一个问题.
struct Byte16
{
int64_t a, b;
};
std::atomic<Byte16> atm;
Byte16 a = { 1, 2 };
atm.compare_exchange_strong(...); // This has a lock on Windows, not on Linux version of code
Run Code Online (Sandbox Code Playgroud) 在进行更改以使CMake项目具有分层文件夹管理之后,source_group()似乎不再正常工作.CMake只是将所有内容转储到默认过滤器中.
我已经尝试了各种正则表达式来获取每个源文件的父文件的相对文件路径,甚至硬编码父CMakeLists.txt中的源文件只是为了看看是否是问题.我也尝试在这些更改后重新生成VS项目几次.
这是您的观看乐趣的示例文件:
父CMakeLists.txt
cmake_minimum_required (VERSION 3.3)
set(SRCS)
add_subdirectory(PlatformDetection)
include_directories (.)
add_library(SystemAbstraction STATIC ${SRCS})
set_property(TARGET SystemAbstraction PROPERTY FOLDER "Engine")
set_target_properties(SystemAbstraction PROPERTIES LINKER_LANGUAGE CXX)
install (TARGETS SystemAbstraction
ARCHIVE DESTINATION lib)
Run Code Online (Sandbox Code Playgroud)
儿童CMakeLists.txt:
cmake_minimum_required (VERSION 3.3)
add_subdirectory(Compilers)
set(SRCS ${SRCS} PARENT_SCOPE)
Run Code Online (Sandbox Code Playgroud)
和
cmake_minimum_required (VERSION 3.3)
set (COMPILER_DETECTION_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/CompilerDetection.h)
set (COMPILER_DETECTION_SRC ${CMAKE_CURRENT_SOURCE_DIR}/CompilerDetection.cpp)
source_group("Header Files\\Platform Detection\\Compilers" FILES ${COMPILER_DETECTION_HEADERS})
source_group("Source Files\\Platform Detection\\Compilers" FILES ${COMPILER_DETECTION_SRC})
set(SRCS ${SRCS} ${COMPILER_DETECTION_HEADERS} ${COMPILER_DETECTION_SRC} PARENT_SCOPE)
Run Code Online (Sandbox Code Playgroud) 我有一个项目,我有大量的条件定义,使跨平台开发更容易.但是我在说服Doxygen提取所有定义时遇到了问题,因为它只会选择那些只发生在评估中的定义.
例如,在下面的代码片段中,Doxygen将记录TARGET_X86_64但不记录TARGET_ARM64.
#if defined(_M_ARM64) || defined(__arm64__) || defined(__aarch64__)
/** Build target is ARM64 if defined. */
#define TARGET_ARM64
#else
/** Build target is x86_64 if defined. */
#define TARGET_X86_64
#endif
Run Code Online (Sandbox Code Playgroud)
启用EXTRACT_ALL没有帮助,并且禁用预处理会导致Doxygen根本不记录任何内容.如何获取doxygen来提取两种情况的文档?
该代码在C ++标准库中是否已定义行为?
std::forward_list<T> list;
list.erase_after(list.before_begin());
Run Code Online (Sandbox Code Playgroud)
直觉会说不,但是我无法找到这种特殊情况的确切标准措辞。
我正在探索使用 clang 作为 ARM 嵌入式开发的编译器。由于 clang 没有等效的.spec文件,因此我很难说服 clang 链接到libc_nano. 我怎样才能告诉 clang 默认情况下不链接任何库,以便我可以指定正确的库,或者将命令重写-lc为-lc_nano?
我尝试运行的命令是:
clang -target arm-none-eabi -mcpu=cortex-a5 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7-a main.c
Run Code Online (Sandbox Code Playgroud)
目前我收到此错误消息:
/usr/lib/llvm-6.0/bin/ld.lld: error: unable to find library -lc
Run Code Online (Sandbox Code Playgroud)
编辑:我注意到 clang 有一个-fno-autolink根据帮助文本的:Disable generation of linker directives for automatic library linking。不过好像并没有什么作用?
EDIT2:我知道我可以滥用符号链接来实现这一点。在这种情况下我想避免使用符号链接,因为它会使构建系统变得脆弱。
当人们通常讨论或使用移动语义时,通常是在移动两个相同类型的类的上下文中.
例如:
MyObject(MyObject &&obj) { // Implementation }
Run Code Online (Sandbox Code Playgroud)
但是,如果MyObject在很大程度上只是像矢量一样包装STL容器,那该怎么办呢?是否会采用移动构造函数来获取向量并将其视为滥用功能?
MyObject(vector<backingtype> &&v) : i_Backing(move(v)) {}
Run Code Online (Sandbox Code Playgroud)
我问这个是因为我正在制作一个UTF-8感知的json解析器,它大量使用复制,而移动容器则足够快.
auto arrayParseRes = jsonArrayParse(input); // Array parse res
auto jsonArray = JsonArray(arrayParseRes.Parse_Value()); // Currently copying json values
Run Code Online (Sandbox Code Playgroud)