这个答案给出了短字符串优化(SSO)的一个很好的高级概述.但是,我想更详细地了解它在实践中是如何工作的,特别是在libc ++实现中:
为了符合SSO资格,字符串有多短?这取决于目标架构吗?
在访问字符串数据时,实现如何区分短字符串和长字符串?它m_size <= 16是一个简单的,还是一个标志,是其他成员变量的一部分?(我想这m_size或其中的一部分也可能用于存储字符串数据).
我专门针对libc ++问了这个问题,因为我知道它使用SSO,甚至在libc ++主页上也提到过.
以下是查看来源后的一些观察结果:
libc ++可以使用两个稍微不同的字符串类内存布局进行编译,这由_LIBCPP_ALTERNATE_STRING_LAYOUT标志控制.这两种布局还区分了little-endian和big-endian机器,这使我们总共有4种不同的变体.我将在下面的内容中假设"正常"布局和小端.
假设进一步size_type是4个字节并且value_type是1个字节,这就是字符串的前4个字节在内存中的样子:
// short string: (s)ize and 3 bytes of char (d)ata
sssssss0;dddddddd;dddddddd;dddddddd
^- is_long = 0
// long string: (c)apacity
ccccccc1;cccccccc;cccccccc;cccccccc
^- is_long = 1
Run Code Online (Sandbox Code Playgroud)
由于短字符串的大小在高7位,因此在访问它时需要移位:
size_type __get_short_size() const {
return __r_.first().__s.__size_ >> 1;
}
Run Code Online (Sandbox Code Playgroud)
类似地,长字符串容量的getter和setter用于__long_mask解决这个问题is_long.
我仍在寻找我的第一个问题的答案,即__min_cap短字符串的容量对不同的架构有什么价值?
其他标准库实现
这个答案很好地概述了std::string其他标准库实现中的内存布局.
我正在开发一个迄今为止用gcc和msvc构建的项目.我们最近也开始用clang构建.
代码中有一些部分,其中特定于平台的事情已经完成:
#ifndef _WIN32
// ignore this in msvc
#endif
Run Code Online (Sandbox Code Playgroud)
由于gcc以前是唯一的非windows构建,这相当于说"只为gcc做这个".但现在它意味着"只为gcc和clang做这个".
然而,仍然有一些情况,我想专门为gcc处理一些东西,而不是为了clang.是否有一种简单而强大的方法来检测gcc,即
#ifdef ???
// do this *only* for gcc
#endif
Run Code Online (Sandbox Code Playgroud) 我有一个数组成员的类,我想初始化为全零.
class X
{
private:
int m_array[10];
};
Run Code Online (Sandbox Code Playgroud)
对于局部变量,有一种简单的零初始化方法(参见此处):
int myArray[10] = {};
Run Code Online (Sandbox Code Playgroud)
此外,类成员m_array显然需要初始化,因为默认初始化整数会见好就收随机的垃圾,如解释在这里.
但是,我可以看到两种方法为成员数组执行此操作:
括号:
public:
X()
: m_array()
{}
Run Code Online (Sandbox Code Playgroud)
带括号:
public:
X()
: m_array{}
{}
Run Code Online (Sandbox Code Playgroud)
两个都正确吗?这两者在C++ 11中有什么区别吗?
在D3.js中,通常从外部csv文件加载数据.这对于大数据非常有效,并且避免在数据更改时更改代码.
但是,有两种情况(仅使用小型csv数据)我想直接在HTML页面中嵌入csv:
我很想知道/弄清楚ECMAScript-6的新变化是否适用于旧的浏览器.
我为什么问这个问题是:
我记得'use strict';在ECMAScript-5中的介绍,它是为了与旧版本的兼容性.
这意味着旧的浏览器将继续正常工作,并且'use strict';在解析新的JavaScript代码时遇到语句时会忽略它.
并且新的JS引擎将以'use strict';某种特殊的方式处理语句,详见此严格模式.
所以,提出问题
我非常怀疑并且好奇地知道ECMAScript-5兼容的浏览器在解析ECMAScript-6代码时会如何表现.
我怀疑的原因是ECMAScript-6新功能涉及语法更改/更新.旧的浏览器是新语法 - 不知道的引擎,当它们遇到以下任何新语法时会开始抛出错误
yield[*], Map, Set, WeakMap, function* foo(){}, =>, for...of etc.
我担心的是ECMAScript-6中的新功能的决定/包含在没有任何代码中断的情况下支持旧浏览器吗?
如果是,那怎么样?
如果不是那么我该怎么做才能让我的旧浏览器用户满意?
我看到一个解决方案,以保持使用包括一些快乐的旧的浏览器的用户transpiler像traceur编译在我的项目.这会将我的ECMAScript-6代码转换为ECMAScript-5等效代码.但是,我还有其他任何解决方案可以让我的旧浏览器用户满意吗?
javascript backwards-compatibility ecmascript-5 ecmascript-6
我的项目中有一个假设的Typescript文件(简化示例).
Utils.ts:
import * as HelperFromNodeModules from 'helper-from-node-modules';
class Utils {
static foo() {
return HelperFromNodeModules.parse(...);
}
}
Run Code Online (Sandbox Code Playgroud)
导入helper-from-node-modules包含一个Javascript文件.
helper-from-node-modules.js:
const dep = require('foo');
function parse(...) {
return bar.map((e) => {...});
}
Run Code Online (Sandbox Code Playgroud)
从@types/helper-from-node-modules index.d.ts:
export function parse(...);
Run Code Online (Sandbox Code Playgroud)
在tsconfig.json除其他外包含以下内容:
{
...
"target": "es5",
"lib": ["es2015.collection","es6", "dom"],
"sourceMap": true,
"allowJs": true,
...
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是Typescript编译器的输出文件是我编译的源代码加上所有的重要性的巨大连接.由于helper-from-node-modules始终是.js文件,编译器似乎只是将其内容附加到输出文件.所以,尽管"target": "es5"输出文件中仍含有ES6工件,如const和(e) => {...},导致在后来的事情是希望严格错误ES5的JavaScript.
有没有办法告诉Typescript编译器/转换器在javascript依赖项上输出 …
javascript typescript ecmascript-6 tsconfig react-create-app
我和这个家伙有同样的问题.使用clang和ccache进行编译每次遇到Q_OBJECT时都会收到此警告:
warning: explicitly assigning value of variable of type 'int' to itself [-Wself-assign]
Run Code Online (Sandbox Code Playgroud)
这只发生在使用ccache时,单独使用clang编译相同的代码工作正常.
CCACHE_CPP2=yes
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎并没有解决我的问题,或者说我做错了.
我试过了:
从命令行构建
CCACHE_CPP2=yes ninja
export CCACHE_CPP2=yes
ninja
从Qt Creator CCACHE_CPP2构建,添加到"构建环境"
我还能做些什么来解决这个宏扩展问题吗?我特别不希望全局禁用警告(因为这很糟糕)或本地(因为这意味着将所有宏包装在特定于编译器的样板文件中).
我有这个函数转换Array为a ParArray,给出线程数作为参数:
def parN[T](collection: Array[T], n: Int) = {
val parCollection = collection.par
parCollection.tasksupport = new ForkJoinTaskSupport(
new concurrent.forkjoin.ForkJoinPool(n))
parCollection
}
Run Code Online (Sandbox Code Playgroud)
现在我想使这个通用,这样它适用于除Array以下之外的集合:
def parN[S, T[S] <: Parallelizable[S, ParIterable[S]]](collection: T[S], n: Int) = {
val parCollection = collection.par
parCollection.tasksupport = new ForkJoinTaskSupport(
new concurrent.forkjoin.ForkJoinPool(n))
parCollection
}
Run Code Online (Sandbox Code Playgroud)
但是当我调用它时parN(Array(1, 2, 3), 2),我收到此错误:
inferred type arguments [Int,Array] do not
conform to method parN's type parameter bounds
[S,T[S] <: scala.collection.Parallelizable[S,scala.collection.parallel.ParIterable[S]]]
Run Code Online (Sandbox Code Playgroud)
另一方面,这是有效的:
val x: Parallelizable[Int, …Run Code Online (Sandbox Code Playgroud) 摘要
如何在C++中使用libarchive编写zip文件,以便路径名是UTF-8编码的?使用UTF-8路径名时,使用OS X/Linux/Windows 8/7-Zip/WinZip时,将正确解码特殊字符.
细节
我正在尝试使用libarchive编写zip存档,在Windows上使用Visual C++ 2013进行编译.
我希望能够将带有非ASCII字符的文件(例如äöü.txt)添加到zip存档中.
在libarchive中有四个函数来设置pathname标头:
void archive_entry_set_pathname(struct archive_entry *, const char *);
void archive_entry_copy_pathname(struct archive_entry *, const char *);
void archive_entry_copy_pathname_w(struct archive_entry *, const wchar_t *);
int archive_entry_update_pathname_utf8(struct archive_entry *, const char *);
Run Code Online (Sandbox Code Playgroud)
不幸的是,它们似乎都没有用.
特别是,我试过:
const char* myUtf8Str = ...
archive_entry_update_pathname_utf8(entry, myUtf8Str);
// this sounded like the most straightforward solution
Run Code Online (Sandbox Code Playgroud)
和
const wchar_t* myUtf16Str = ...
archive_entry_copy_pathname_w(entry, myUtf16Str);
// UTF-16 encoded strings seem to be the default on Windows
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,生成的zip存档都不会在Windows资源管理器和7-Zip中正确显示文件名.
我确信我的输入字符串编码正确,因为我从Qt QString实例转换它们在我的代码的其他部分非常有效:
const char* …Run Code Online (Sandbox Code Playgroud) 我正在尝试修改web_tree_image小部件.我希望在悬停或点击时显示更大的图像,而不是仅在列中显示小图像.为了实现这一点,我试图通过覆盖start函数来渲染窗口小部件后添加回调,如文档中所述.
因此,我将以下代码添加到web_tree_image.js:
openerp.web_tree_image = function (instance) {
instance.web.list.Image = instance.web.list.Column.extend({
// [...]
start: function() {
console.log("start called");
// [... add callbacks ...]
},
// [...]
});
};
Run Code Online (Sandbox Code Playgroud)
但是,start从不调用该函数,因此这不起作用.
我还没有完全理解通常会start被调用的代码路径,但似乎它在某种程度上是不同的web.list.Column.
应该start打电话给我,我做错了什么?或者在创建DOM元素之后还有另一种执行代码的方法吗?
在尝试创建一个Angular指令,使其内容的大小适应容器的大小时,我偶然发现了以下问题:
最小的HTML代码段:
<my-tag id="testWidth">
<div>some text</div>
</my-tag>
Run Code Online (Sandbox Code Playgroud)
当读取宽度时my-tag,我得到0Chrome 的结果,而Firefox返回正确的结果.在Chrome中,如果我替换,结果也是正确my-tag的div.
这是我用来获取宽度的表达式:
document.getElementById('testWidth').offsetWidth
Run Code Online (Sandbox Code Playgroud)
据我所知,my-tag应该是一个有效的自定义元素名称.还有什么我做错了,或者这只是Chrome中的一个错误?
Chrome版本:49.0.2623.112米
jsfiddle快速测试
我试图了解Chrome的行为是否正确或是否是错误.
该MDN文档说:
HTMLElement.offsetWidth只读属性返回元素的布局宽度.
据我所知,它并没有说这仅适用于具有块显示的元素.我还通过Firefox返回我期望的事实来支持我的理解.
对于span标签也可以观察到相同的行为差异,请看这个小提琴.
我有一个我想在单元测试中使用的枚举类:
enum class MyEnumClass
{
MyEntryA,
MyEntryB
};
Run Code Online (Sandbox Code Playgroud)
我想用它如下:
MyEnumClass myEnumValue = MyEnumClass::MyEntryA;
BOOST_CHECK_EQUAL(myEnumValue, MyEnumClass::MyEntryB);
Run Code Online (Sandbox Code Playgroud)
但是我得到了这个错误,显然因为boost测试试图输出值:
include/boost/test/test_tools.hpp:326:14: error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
ostr << t; // by default print the value
^
Run Code Online (Sandbox Code Playgroud)
添加丑陋的static_cast"解决"问题:
BOOST_CHECK_EQUAL(static_cast<int>(myEnumValue), static_cast<int>(MyEnumClass::MyEntryB));
Run Code Online (Sandbox Code Playgroud)
但是我想避免为每个枚举类做到这一点.我还想避免<<为每个枚举类定义流操作符.
是否有更简单的方法来使用带有boost测试的枚举类?
或者其他单元测试框架是否有更好的方法来处理枚举类?
如何访问父组件中的子数据?
这是父组件:
<script>
import Search from './components/Search.svelte'
</script>
<Search />
Run Code Online (Sandbox Code Playgroud)
这是子组件:
<script>
export let term
</script>
<input bind:value={term} />
Run Code Online (Sandbox Code Playgroud)
谢谢!
c++ ×6
javascript ×4
dom ×2
ecmascript-6 ×2
boost-test ×1
callback ×1
ccache ×1
clang ×1
csv ×1
d3.js ×1
ecmascript-5 ×1
enum-class ×1
gcc ×1
generics ×1
html5 ×1
libarchive ×1
libc++ ×1
odoo-8 ×1
openerp ×1
openerp-8 ×1
optimization ×1
qt ×1
scala ×1
string ×1
svelte ×1
tsconfig ×1
types ×1
typescript ×1
utf-8 ×1
wstring ×1
zip ×1